Kotlin 将两个状态流合并为新的状态流

Kotlin 将两个状态流合并为新的状态流,kotlin,collections,kotlin-flow,Kotlin,Collections,Kotlin Flow,我有两个状态流。是否有可能将它们结合起来并获得新的状态流?从逻辑上讲,这应该是可能的,因为两个状态流都有初始值,但正如我看到的,combine函数只返回Flow而不返回StateFlow。使用combine操作符,需要两个流和一个转换函数来组合两个流的结果 val int=MutableStateFlow2 val double=可变状态流1.8 int.combinedouble{i,d-> i+d }.collect::println 使用组合运算符,需要两个流和一个转换函数来组合两个流的结

我有两个状态流。是否有可能将它们结合起来并获得新的状态流?从逻辑上讲,这应该是可能的,因为两个状态流都有初始值,但正如我看到的,combine函数只返回Flow而不返回StateFlow。

使用combine操作符,需要两个流和一个转换函数来组合两个流的结果

val int=MutableStateFlow2 val double=可变状态流1.8 int.combinedouble{i,d-> i+d }.collect::println 使用组合运算符,需要两个流和一个转换函数来组合两个流的结果

val int=MutableStateFlow2 val double=可变状态流1.8 int.combinedouble{i,d-> i+d }.collect::println
到目前为止,我创建了以下函数:

fun <T1, T2, R> combineState(
        flow1: StateFlow<T1>,
        flow2: StateFlow<T2>,
        scope: CoroutineScope = GlobalScope,
        sharingStarted: SharingStarted = SharingStarted.Eagerly,
        transform: (T1, T2) -> R
): StateFlow<R> = combine(flow1, flow2) {
    o1, o2 -> transform.invoke(o1, o2)
}.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value))

到目前为止,我创建了以下函数:

fun <T1, T2, R> combineState(
        flow1: StateFlow<T1>,
        flow2: StateFlow<T2>,
        scope: CoroutineScope = GlobalScope,
        sharingStarted: SharingStarted = SharingStarted.Eagerly,
        transform: (T1, T2) -> R
): StateFlow<R> = combine(flow1, flow2) {
    o1, o2 -> transform.invoke(o1, o2)
}.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value))
您可以使用combine操作符,然后对由此产生的流使用stateIn函数

从kotlinx coroutines存储库中的stateIn:

stateIn函数将冷流转换为热状态流,该流在给定的协程范围内启动,与多个下游订户共享上游流的单个运行实例最近发出的值

截至撰写本文件时,其签名为:

fun <T> Flow<T>.stateIn(
  scope: CoroutineScope,
  started: SharingStarted,
  initialValue: T
): StateFlow<T> (source)
stateString的类型为StateFlow,您已经成功地将另外两个StateFlow组合成一个StateFlow。

您可以使用combine运算符,然后对由此产生的流使用stateIn函数

从kotlinx coroutines存储库中的stateIn:

stateIn函数将冷流转换为热状态流,该流在给定的协程范围内启动,与多个下游订户共享上游流的单个运行实例最近发出的值

截至撰写本文件时,其签名为:

fun <T> Flow<T>.stateIn(
  scope: CoroutineScope,
  started: SharingStarted,
  initialValue: T
): StateFlow<T> (source)

stateString的类型应为StateFlow,您已经成功地将另外两个StateFlow组合成一个StateFlow。

我想您找到了一些这是为什么您特别需要StateFlow?@LouisWasserman在某些地方我只需要读取当前值而不收集它我想您找到了一些这是为什么您特别需要StateFlow?@LouisWasserman在某些地方我需要它只是为了读取当前值而不收集itI需要特定的StateFlow,但此函数返回Flow我需要特定的StateFlow,但此函数返回Flow,并且一如既往,在我发布此消息后大约5秒钟,我意识到您使用stateIn回答了您自己的问题。唉,我将把这篇描述留给后人。和往常一样,在我发布这篇文章大约5秒钟后,我意识到你用stateIn回答了你自己的问题。唉,我将把这个描述留给后人。