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 作为流的元素,因此您可以发出 null
或 UserLoginStatus.Anonymous
作为第一个默认值。
我有 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 作为流的元素,因此您可以发出 null
或 UserLoginStatus.Anonymous
作为第一个默认值。