Kotlin Flow 如何组合两个流并仅在第一个流发送元素时发出结果

星星瑶*_*星星瑶 6 android kotlin kotlin-flow

有两个流:FlowA 和 FlowB。

我想将它们组合起来,仅当 FlowA 发出元素时才从 FlowA 获取最新元素,并从 FlowB 获取最新元素。这就像组合 FlowA 和 FlowB,但仅当 FlowA 发出元素时才会触发组合流。

Jof*_*rey 4

如果flowA不包含重复元素,或者如果您可以对 A 的重复元素“不触发”,则可以使用zipdistinctUntilChangedBy实现您想要的效果,如下所示:

val flowA = flowOf("a", "b", "c")
val flowB = flowOf(1, 2, 3)

val resultFlow = flowA.zip(flowB)
                      .distinctUntilChangedBy { (a, _) -> a }
                      .map { (a, b) -> TODO("combine a and b") }
Run Code Online (Sandbox Code Playgroud)

另一种选择是StateFlow从 B 中创建一个并在需要时访问最新值(但它需要一个范围来收集状态中的 B,因此它使此代码半热):

val flowA = flowOf("a", "b", "c")
val flowB = flowOf(1, 2, 3)

val stateB = flowB.stateIn(someScope)
val resultFlow = flowA.map { a -> 
    val b = stateB.value
    TODO("combine a and b")
}
Run Code Online (Sandbox Code Playgroud)