Kotlin中如何从Flow<Resources<List<Item>?>>返回值中获取Item列表
从
Flow<Resources<List<Item>?>>中获取Item列表的方法 你拿到的返回值是Kotlin响应式流Flow,每个发射的元素是自定义密封类Resources的实例,分别对应加载中、请求成功、请求错误三种状态,只需要对Resources做类型判断即可提取到目标列表。
全状态处理实现
如果需要同时处理加载、成功、错误三种状态,直接在协程作用域中收集Flow即可,示例代码如下:
// 示例:Android ViewModel 中使用场景 viewModelScope.launch { getItems() .collect { resource -> when (resource) { // 加载中状态,可按需展示加载提示 is Resources.Loading -> { // 处理加载逻辑,比如更新加载状态变量 } // 请求成功,此分支可拿到Item列表 is Resources.Success -> { val itemList: List<Item>? = resource.data // 空安全校验后处理业务逻辑 itemList?.let { nonNullList -> // 列表非空时的逻辑,比如更新UI、缓存数据等 } } // 请求错误状态,可按需弹出错误提示 is Resources.Error -> { val errorMsg = resource.throwable.message ?: "请求失败,请稍后重试" // 处理错误逻辑 } } } }
仅提取成功列表的简化写法
如果不需要处理加载、错误状态,只想拿到成功返回的列表,可以用Flow操作符做过滤简化:
viewModelScope.launch { getItems() // 仅保留Success类型的结果 .filterIsInstance<Resources.Success<List<Item>?>>() // 直接提取列表字段 .map { it.data } .collect { itemList -> // 此处直接获取到Item列表 itemList?.let { // 处理业务逻辑 } } }
注意事项
- Flow收集操作必须运行在协程作用域内:Android 场景建议使用
viewModelScope(ViewModel中)或lifecycleScope(Activity/Fragment中),普通JVM场景可按需选择自定义协程作用域 Resources.Success携带的data字段可空,建议获取后做空安全校验再处理业务逻辑- Android UI更新场景下,使用官方协程作用域收集Flow时,回调默认运行在主线程,无需额外切换线程
内容的提问来源于stack exchange,提问作者Ali A. Jalil
相关产品推荐
相关产品推荐

