如何判断Kotlin Flow执行完成且未返回任何数据
挂起函数(suspending function)可以异步返回单个值,但我们如何返回多个经异步计算得出的值?这就是Kotlin Flows的适用场景。
判断Flow执行完成且无产出的方案
方案1:使用内置onEmpty操作符(推荐)
这是最贴合业务场景的原生方案,onEmpty回调仅会在Flow正常执行完成、且全程没有发射任何值时触发,刚好匹配「API请求成功但无数据返回」的判断需求,你可以在回调里处理空状态逻辑,也可以主动发射默认占位值:
// 模拟后端接口返回的Flow fun fetchApiData(): Flow<ApiData> = flow { // 内部执行接口请求,接口返回空所以没有调用emit发射任何值 } lifecycleScope.launch { fetchApiData() .onEach { // 处理接口返回的非空数据 renderData(it) } .onEmpty { // 进入该回调即代表Flow执行完成且未产出任何数据 // 可以在这里做空状态UI渲染,或者发射默认值兜底 renderEmptyState() } .catch { // 处理请求异常场景,注意:因异常终止的Flow不会触发onEmpty回调 renderError(it) } .collect() }
方案2:使用count()/toList()兜底判断
如果你需要在Flow全部执行完成后统一判断状态,可以用toList()接收所有发射值后判断是否为空,或者用count()直接统计发射元素数量,等于0即代表无数据产出:
lifecycleScope.launch { val dataList = fetchApiData().toList() if (dataList.isEmpty()) { // 执行空状态逻辑 } else { // 处理返回数据 } }
该方案适合数据量小的流场景,大数量流不推荐使用,会持有所有发射元素造成内存占用过高。
内容的提问来源于stack exchange,提问作者Johann
相关产品推荐
相关产品推荐

