使用 Flow 从 Room 获取数据

问题描述 投票:0回答:1

大家好,我无法从我的数据库中获取数据:

我的 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。 自从我检查以来,我知道我的数据库中有客户。

android kotlin android-room kotlin-coroutines flow
1个回答
1
投票

首先从所有地方删除

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
© www.soinside.com 2019 - 2024. All rights reserved.