You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ViewModel中将Flow转为List?请求返回200却无法获取成功状态

问题解决步骤

你的代码存在两个关键问题,导致无法获取成功状态:

1. UseCase中的Flow未发射数据

getAllUsers函数里,处理完接口响应并转换为List<UsersModel>后,没有调用emit()将数据发送到Flow中,导致Flow没有任何数据输出。

修正后的getAllUsers代码:

override suspend fun getAllUsers(): Flow<List<UsersModel>> = flow {
    val response = randomUserApi.getResults()
    if (response.isSuccessful && response.body() != null) {
        val userModels = response.body()!!.results.map { it.toModel() }
        emit(userModels) // 发射转换后的用户列表
    } else {
        // 接口失败时抛出异常,让ViewModel捕获
        throw Exception(response.message() ?: "接口请求失败")
    }
}

2. ViewModel中未正确提取Flow中的List数据

useCase.invoke()返回的是Flow<List<UsersModel>>,而UiState.SUCCESS需要的是List<UsersModel>,直接赋值会类型不匹配。你可以通过以下两种方式获取Flow中的数据:

方式一:使用first()获取单次发射的数据(推荐,因为接口请求是单次操作)

适合这种仅发射一次数据的场景,直接获取Flow的第一个(也是唯一一个)值:

fun loadUsers() = viewModelScope.launch {
    _uiState.value = UiState.LOADING
    try {
        val usersFlow = useCase.invoke()
        val users = usersFlow.first() // 获取Flow中的第一个数据
        _uiState.value = UiState.SUCCESS(users)
    } catch (e: Exception) {
        _uiState.value = UiState.FAILURE(e.localizedMessage ?: "未知错误")
    }
}

方式二:使用collect()收集数据

如果Flow可能多次发射数据(比如实时更新场景),可以用collect监听数据变化:

fun loadUsers() = viewModelScope.launch {
    _uiState.value = UiState.LOADING
    try {
        useCase.invoke().collect { users ->
            _uiState.value = UiState.SUCCESS(users)
        }
    } catch (e: Exception) {
        _uiState.value = UiState.FAILURE(e.localizedMessage ?: "未知错误")
    }
}

这样修改后,就能正确获取接口返回的用户列表,并更新到成功状态中。

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:45:04