Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?
Posted
技术标签:
【中文标题】Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?【英文标题】:Kotlin coroutines: How to flatMapConcat 3 flows, if one of them has not started emitting yet? 【发布时间】:2021-11-14 19:56:54 【问题描述】:我有 3 个流程:
val flow1 = ... // emits values from the app start
val flow2 = ... // emits values from the app start
val flow3 = someBooleanFlow.flatMapLatest if(it) flowOf(42) else emptyFlow() // emits when user registered
我需要:
val state = flow1.flatMapConcat value1 ->
flow2.flatMapConcat value2 ->
flow3.flatMapConcat value3 -> when ... // so value3 is not received if flow3 is empty,
// but I need its default value here to perform "when" logics
问题是当一个流没有发出时,如何在 flatMapConcat 中取一个默认值?
该问题也适用于combine
【问题讨论】:
【参考方案1】:您可以在Flow
上使用onStart 来发出初始值:
val flowWithInitialValue = sourceFlow.onStart emit(initialValue)
您也可以为此使用StateFlow
,并在构建时提供您的初始值。
我猜flow3
代表登录用户的某种用户 ID。
在这种情况下,我不会使用emptyFlow()
来表示未记录的情况。您可能可以使用可为空的用户 ID 或密封类作为流的元素,因此您可以发出 null
或 UserLoginStatus.Anonymous
作为第一个默认值。
【讨论】:
谢谢!!!onStart
可以正常工作)以上是关于Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?的主要内容,如果未能解决你的问题,请参考以下文章