将两个 Kotlin Flow 结合成一个 Flow,该 Flow 发射来自两个原始 Flow 的最新值?

7
如果我们定义了以下两个流程:
val someflow = flow {
    emit("something")
}

另一个类似定义的流程如下:

val stateFlow = MutableStateFlow("some value")

是否可以将两个流合并成一个流,它只发出someflow或者stateFlow中最后发出的值? stateFlow可能会在未来某个时间发出值,但在此之前,我想要someflow最后发出的任何值。在“合并”流中,我只想取someflow发出的第一个值,然后能够观察stateFlow的其余更新。
看起来好像可以使用combine函数实现这一点,但我只想发出两个流中最新发出的值,不关心一个流的最后一个值是什么。
2个回答

10

存在一个flattenMerge函数,它将Flow作为单个Flow执行,这可能是您所需的。例如:

val numbersFlow = flowOf("1", "2", "3", "4").onEach { delay(1000) }
val lettersFlow = flowOf("A", "B", "C").onEach { delay(2000) }
flowOf(numbersFlow, lettersFlow).flattenMerge().collect {
    println("Result $it")
}

打印品:

Result 1
Result A
Result 2
Result 3
Result B
Result 4
Result C

因此,对于您的情况,它会看起来像这样:

flowOf(someFlow, stateFlow).flattenMerge().collect {
    println("Result $it")
}

0
你可以使用类似这样的代码:
fun <T> Flow<T>.merge(otherFlow: Flow<T>) = flow {
    this@merge.collect { value ->
        emit(value)
    }
    otherFlow.collect { value ->
        emit(value)
    }
}

请注意,只有当两个流程都完成/取消时,才会完成生成的流程。
用法:
someFlow.merge(stateFlow).collect {
    println(it)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接