在处理
flatMapLatest
和 emptyFlow
以及 firstOrNull
时,我遇到了一个奇怪的问题。
场景A:
val dataFlow: Flow<Boolean> = emptyFlow()
launch {
val data = dataFlow.firstOrNull() // returns data = null
}
场景B:
val rootFlow: MutableStateFlow<Boolean?> = MutableStateFlow(null)
val dataFlow: Flow<Boolean> = rootFlow.flatMapLatest {
emptyFlow()
}
launch {
val data = dataFlow.firstOrNull() // blocks and does not return any value
}
所以我的问题是,为什么
firstOrNull
在场景 B 中不返回任何值。
我看到 flatMapLatest 正在使用可变状态流的初始 null
值进行调用。
rootFlow
是一个StateFlow
,这意味着它永远不会结束。
您的
dataFlow
是 rootFlow
的转换,因此在源流结束之前它不会结束。
这意味着在这种情况下,
dataFlow.firstOrNull()
将永远挂起,因为它不断将rootFlow
的每个值转换为空流。