Kotlin 协程:如果其中一个还没有开始发射,如何 flatMapConcat 3 流?

Kotlin coroutines: How to flatMapConcat 3 flows, if one of them has not started emitting yet?

我有 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

您可以在 Flow 上使用 onStart 来发出初始值:

val flowWithInitialValue = sourceFlow.onStart { emit(initialValue) }

您也可以为此使用 StateFlow,并在构建时提供您的初始值。

我猜 flow3 代表登录用户的某种用户 ID。

在这种情况下,我不会使用 emptyFlow() 来表示未记录的情况。您可以使用可为空的用户 ID 或密封的 class 作为流的元素,因此您可以发出 nullUserLoginStatus.Anonymous 作为第一个默认值。