flatMapLatest 不会触发空流的firstOrNull

问题描述 投票:0回答:1

在处理

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
值进行调用。

android kotlin kotlin-coroutines kotlin-flow
1个回答
0
投票

rootFlow
是一个
StateFlow
,这意味着它永远不会结束。

您的

dataFlow
rootFlow
的转换,因此在源流结束之前它不会结束。

这意味着在这种情况下,

dataFlow.firstOrNull()
将永远挂起,因为它不断将
rootFlow
的每个值转换为空流。

© www.soinside.com 2019 - 2024. All rights reserved.