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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:45:04