大家好,我无法从我的数据库中获取数据:
我的 DAO 中有:
@Transaction
@Query("SELECT * FROM ClientEntity")
fun getClients(): Flow<List<ClientEntity>>
RepoImpl:
override suspend fun getClients(): Flow<List<ClientEntity>> {
return clientDao.getClients()
}
视图模型:
fun getClients(): Flow<List<Client>> = flow {
val clients = mutableListOf<Client>()
clientsRepository.getClients().collect { clientEntities ->
clients.addAll(clientEntities.map { it.toClient() })
}
emit(clients)
}
屏幕:
LaunchedEffect(key1 = myContext) {
viewModel.getClients().collect{
val clients = viewModel.getClients()
Log.d(TAG, "ClientsListScreen: da $clients")
}
}
我正在使用 jetpack compose,使用这段代码我在屏幕上看不到 logd。 自从我检查以来,我知道我的数据库中有客户。
首先从所有地方删除
getClients()
的 suspend 关键字
你也可以像这样改进你的
View Model
代码
private val _clientResponse: MutableState<ClientState> = mutableStateOf(WeatherState())
val clientResponse: State<ClientState> = _clientResponse
viewModelScope.launch {
repository.getClients()
.onStart {
_clientResponse.value = ClientState(
isLoading = true
)
}.catch {
_clientResponse.value = ClientState(
error = it.message ?: "Something went wrong"
)
}.collect{
_clientResponse.value = ClientState(
data = it
)
}
}
data class ClientState(
val data: List< ClientEntity > = emptyList(),
val error: String = "",
val isLoading: Boolean = false
)
在可组合函数中
val clientResponse = viewModel.clientResponse.value
if (clientResponse.data.isNotEmpty())
// do something
if (clientResponse.error.isNotEmpty)
// do something
if(clientResponse.isLoading)
// do something