在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
相关产品推荐
相关产品推荐

