如何在ViewModel中将Flow转换为List?

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

我收到了 200 代码,我看到正在加载/错误,但无法获得成功状态。
如何在 ViewModel 中将 Flow 转换为 List?

fun loadUsers() = viewModelScope.launch {
    _uiState.value = UiState.LOADING
    try {
        val users = withContext(Dispatchers.IO) { useCase.invoke() }
        _uiState.value = UiState.SUCCESS(users) // **i get an error Required:List<UsersModel> Found: Flow<List<UsersModel>>**
    } catch (e: Exception) {
        _uiState.value = UiState.FAILURE(e.localizedMessage)
    }
}

override suspend fun getAllUsers(): Flow<List<UsersModel>> = flow {

    val response = randomUserApi.getResults()

    if (response.isSuccessful && response.body() != null) {
        response.body()?.let {
            response.body()!!.results.map {
                it.toModel()
            }
        }
    }
} 

sealed class UiState {
    data class SUCCESS(val users: List<UsersModel>) : UiState()
android kotlin viewmodel
1个回答
0
投票
  1. Flow 首先在这里使用是不合适的,因为您一次检索单个事物。
  2. 如果您使用的是流,则不应由挂起函数返回它,因为流是立即创建的,而不同步执行任何工作。但实际上,由于您要立即检索一件事,因此您应该使用一个直接返回列表或抛出错误的挂起函数。
  3. 如果您要使用流,则该流不会执行任何操作,因为您永远不会从构建器 lambda 发出任何内容。
  4. 您不需要指定调度程序来调用挂起函数。挂起函数不会阻塞,除非您错误地将阻塞代码放入挂起函数中,而没有将其包装在适当的调度程序中。

这里是更正后的用例代码:

override suspend fun getAllUsers():List<UsersModel> {
    val response = randomUserApi.getResults()
    val responseBody = response.body()

    if (response.isSuccessful && responseBody != null) {
        return responseBody.results.map { it.toModel() }
    }
    throw IOException(
        "Failed to retrieve user model: " + 
            response.errorBody().toString()
    )
} 

© www.soinside.com 2019 - 2024. All rights reserved.