从 Room 中使用 Flow 获取数据

huangapple go评论71阅读模式
英文:

Fetch data from Room with Flow

问题

Hi guys I cannot fetch data from my database:

I have in my DAO:

@Transaction
@Query("SELECT * FROM ClientEntity")
fun getClients(): Flow<List>

RepoImpl:

override suspend fun getClients(): Flow<List> {
return clientDao.getClients()
}
ViewModel:

fun getClients(): Flow<List> = flow {
val clients = mutableListOf()
clientsRepository.getClients().collect { clientEntities ->
clients.addAll(clientEntities.map { it.toClient() })
}
emit(clients)
}
Screen:

LaunchedEffect(key1 = myContext) {
viewModel.getClients().collect{
val clients = viewModel.getClients()
Log.d(TAG, "ClientsListScreen: da $clients")
}

}
Im using jetpack compose, with this code I dont see logd in my Screen.
I know that are clients in my database since I inspected it.

英文:

Hi guys I cannot fetch data from my database:

I have in my DAO:

  1. @Transaction
  2. @Query(&quot;SELECT * FROM ClientEntity&quot;)
  3. fun getClients(): Flow&lt;List&lt;ClientEntity&gt;&gt;

RepoImpl:

  1. override suspend fun getClients(): Flow&lt;List&lt;ClientEntity&gt;&gt; {
  2. return clientDao.getClients()
  3. }

ViewModel:

  1. fun getClients(): Flow&lt;List&lt;Client&gt;&gt; = flow {
  2. val clients = mutableListOf&lt;Client&gt;()
  3. clientsRepository.getClients().collect { clientEntities -&gt;
  4. clients.addAll(clientEntities.map { it.toClient() })
  5. }
  6. emit(clients)
  7. }

Screen:

  1. LaunchedEffect(key1 = myContext) {
  2. viewModel.getClients().collect{
  3. val clients = viewModel.getClients()
  4. Log.d(TAG, &quot;ClientsListScreen: da $clients&quot;)
  5. }
  6. }

Im using jetpack compose, with this code I dont see logd in my Screen.
I know that are clients in my database since I inspected it.

答案1

得分: 2

从所有地方删除getClients()中的suspend关键字

您还可以改进您的View Model代码如下:

  1. private val _clientResponse: MutableState<ClientState> = mutableStateOf(ClientState())
  2. val clientResponse: State<ClientState> = _clientResponse
  3. viewModelScope.launch {
  4. repository.getClients()
  5. .onStart {
  6. _clientResponse.value = ClientState(
  7. isLoading = true
  8. )
  9. }.catch {
  10. _clientResponse.value = ClientState(
  11. error = it.message ?: "Something went wrong"
  12. )
  13. }.collect {
  14. _clientResponse.value = ClientState(
  15. data = it
  16. )
  17. }
  18. }

Composable函数中:

  1. val clientResponse = viewModel.clientResponse.value
  2. if (clientResponse.data.isNotEmpty())
  3. // 做一些操作
  4. if (clientResponse.error.isNotEmpty())
  5. // 做一些操作
  6. if (clientResponse.isLoading)
  7. // 做一些操作

请注意,这些是您提供的代码的翻译部分。

英文:

First remove suspend keyword of getClients() from everywhere

You can also improve your View Model code like this

  1. private val _clientResponse: MutableState&lt;ClientState&gt; = mutableStateOf(WeatherState())
  2. val clientResponse: State&lt;ClientState&gt; = _clientResponse
  3. viewModelScope.launch {
  4. repository.getClients()
  5. .onStart {
  6. _clientResponse.value = ClientState(
  7. isLoading = true
  8. )
  9. }.catch {
  10. _clientResponse.value = ClientState(
  11. error = it.message ?: &quot;Something went wrong&quot;
  12. )
  13. }.collect{
  14. _clientResponse.value = ClientState(
  15. data = it
  16. )
  17. }
  18. }
  19. data class ClientState(
  20. val data: List&lt; ClientEntity &gt; = emptyList(),
  21. val error: String = &quot;&quot;,
  22. val isLoading: Boolean = false
  23. )

In Composable function

  1. val clientResponse = viewModel.clientResponse.value
  2. if (clientResponse.data.isNotEmpty())
  3. // do something
  4. if (clientResponse.error.isNotEmpty)
  5. // do something
  6. if(clientResponse.isLoading)
  7. // do something

huangapple
  • 本文由 发表于 2023年2月27日 01:17:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/75573717.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定