Kotlin协程:3个Flow做flatMapConcat时如何为未发射的Flow设默认值
Kotlin Flow 组合时为空流/未发射流设置默认值的方法
核心操作符
你可以直接使用Flow官方提供的两个操作符处理对应场景:
onStart:订阅流时优先发射指定的默认值,适配流还未开始发射值的场景onEmpty:流正常结束但未发射任何值时发射指定默认值,适配空流场景
flatMapConcat 场景适配
针对你给出的代码示例,只需要给flow3添加上述操作符即可保证总能拿到value3:
// 提前给flow3封装默认值,示例默认值为0 val flow3WithDefault = someBooleanFlow .flatMapLatest{ if(it) flowOf(42) else emptyFlow() } .onStart { emit(0) } // 订阅时先发射默认值,解决未注册时flow3无值的问题 .onEmpty { emit(0) } // 流为空时发射默认值,解决空流场景 // 组合逻辑无需修改,直接使用封装后的flow val state = flow1.flatMapConcat{ value1 -> flow2.flatMapConcat{ value2 -> flow3WithDefault.flatMapConcat{ value3 -> when{ // 此处可正常拿到value3执行业务逻辑 } } } }
如果默认值需要依赖上游flow1、flow2的计算结果,也可以在嵌套层级动态设置:
val state = flow1.flatMapConcat { value1 -> flow2.flatMapConcat { value2 -> // 可根据上游值动态生成默认值 val dynamicDefault = if (value1 > 100) -1 else 0 flow3 .onStart { emit(dynamicDefault) } .onEmpty { emit(dynamicDefault) } .flatMapConcat { value3 -> when { /* 业务逻辑 */ } } } }
combine 场景适配
combine操作符需要所有参与组合的流都至少发射过一次值才会触发回调,同样可以用上述操作符给每个流配置初始值:
val state = combine( flow1, flow2, // 直接给flow3配置默认值 flow3.onStart { emit(0) }.onEmpty { emit(0) } ) { value1, value2, value3 -> when { // 可正常拿到三个值执行业务逻辑 } }
补充说明
如果你使用的是StateFlow,本身自带初始值配置,直接参与组合即可,无需额外添加上述操作符。
内容的提问来源于stack exchange,提问作者Alexey Kolosov
相关产品推荐
相关产品推荐

