组合许多 Kotlin 流以获取它们的当前值
Combine many Kotlin flows to get just their current value
我正在使用 return 流的首选项 API。
在某些情况下,我需要组合来自不同偏好的值。我知道我可以使用
flow.combine
.
由于我需要合并的方法是一个 suspend
函数,并且流中的值不再需要流向任何地方,我也可以这样定义:
suspend fun <T> Flow<T>.currentValue(): T {
var res: T? = null
this.collect {
res = it
}
return res!!
}
然后一次只读取一个值:
val val1 = flow1.currentValue()
val val2 = flow2.currentValue()
val val3 = flow3.currentValue()
有更好的方法吗?或者我应该只使用 combine
方法?
您不需要定义 currentValue
函数。已经有一个 Flow.first()
函数,它 return 是 Flow 的第一个值。由于这些流程设计为始终发出具有当前偏好值的初始值,因此可以正常工作。
旁注,您的 currentValue()
函数永远不会 return 因为 collect
不会 return 直到 Flow 完成。
您是要对每个 Flow 单独调用 first()
还是 combine
所有 Flow 并在组合 Flow 上调用 first()
由您决定。我不认为这两种方式更清洁。
我正在使用 return 流的首选项 API。
在某些情况下,我需要组合来自不同偏好的值。我知道我可以使用
flow.combine
.
由于我需要合并的方法是一个 suspend
函数,并且流中的值不再需要流向任何地方,我也可以这样定义:
suspend fun <T> Flow<T>.currentValue(): T {
var res: T? = null
this.collect {
res = it
}
return res!!
}
然后一次只读取一个值:
val val1 = flow1.currentValue()
val val2 = flow2.currentValue()
val val3 = flow3.currentValue()
有更好的方法吗?或者我应该只使用 combine
方法?
您不需要定义 currentValue
函数。已经有一个 Flow.first()
函数,它 return 是 Flow 的第一个值。由于这些流程设计为始终发出具有当前偏好值的初始值,因此可以正常工作。
旁注,您的 currentValue()
函数永远不会 return 因为 collect
不会 return 直到 Flow 完成。
您是要对每个 Flow 单独调用 first()
还是 combine
所有 Flow 并在组合 Flow 上调用 first()
由您决定。我不认为这两种方式更清洁。