Kotlin 结合了 2 个以上的流程
Posted
技术标签:
【中文标题】Kotlin 结合了 2 个以上的流程【英文标题】:Kotlin combine more than 2 flows 【发布时间】:2021-08-28 12:37:21 【问题描述】:我希望结合 4 个 StateFlow 值并从中生成 1 个 StateFlow。我已经知道这样的组合功能:
val buttonEnabled = cameraPermission.combine(micPermission)
//some logic
这怎么能用 4 个流来完成?当我尝试以下操作时,我得到了参数太多的错误,但是组合函数文档确实说您最多可以添加 5 个流?
val buttonEnabled = cameraPermission.combine(micPermission, locationPermission, contactsPermission)
【问题讨论】:
使用***combine
函数代替扩展函数,并将所有四个流放在括号中。
这确实解决了最初的错误,但现在我遇到了这个错误:“重载分辨率模糊。所有这些功能都匹配”。
@alfietap 您在 lambda 中指定的参数数量是否与 combine
的参数中的流一样多?
不,这是我的问题,现在一切正常!
您能解释一下它现在是如何工作的吗?
【参考方案1】:
“但是合并函数文档确实说您最多可以添加 5 个流?”
是的语法:
combine(flow1, flow2, flow3, flow4) t1, t2, t3, t4 -> resultMapper.stateIn(scope)
如果您需要超过 5 个组合,那么创建自己的 6 个函数示例非常简单:
fun <T1, T2, T3, T4, T5, T6, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
transform: suspend (T1, T2, T3, T4, T5, T6) -> R
): Flow<R> = combine(
combine(flow, flow2, flow3, ::Triple),
combine(flow4, flow5, flow6, ::Triple)
) t1, t2 ->
transform(
t1.first,
t1.second,
t1.third,
t2.first,
t2.second,
t2.third
)
【讨论】:
以上是关于Kotlin 结合了 2 个以上的流程的主要内容,如果未能解决你的问题,请参考以下文章