有没有办法从 Flow 中创建 StateFlow

Posted

技术标签:

【中文标题】有没有办法从 Flow 中创建 StateFlow【英文标题】:Is there a way to create a StateFlow from a Flow 【发布时间】:2022-01-19 07:40:04 【问题描述】:

我可以从 Flow 中创建 StateFlow 以便获得它的 .value 吗?有没有办法在不使用 .collect 的情况下做到这一点?

类似

val myStateFlow = StateFlow<MyDataType>(this.existingFlow)

这样以后,当有人点击按钮时,我可以说出流的最后一个值是多少?

fun handleButton() 
  val lastValue = myStateFlow.value
  print(lastValue)

我宁愿不使用收集,因为我不希望流在其他人决定收集它之前流动。

【问题讨论】:

stateIn 【参考方案1】:

有一个名为stateIn的内置函数。

有没有办法在不使用 .collect 的情况下做到这一点? 我宁愿不使用收集,因为我不希望流在其他人决定收集它之前流动。

如果你使用stateIn的非挂起重载,流收集不必马上开始,但是你必须为状态提供一个初始值(因为这个调用不能等待第一个值如果它不暂停,则流)。

在这种情况下,您可以使用started 参数来使实际的收集变得惰性,但请注意,访问myStateFlow.value 不会触发流的收集,只会一遍又一遍地返回初始值。只有StateFlow 上的终端流运算符(如collect)才会真正触发底层流集合,这可能不是您想要的(但也可能是!)。

请注意,如果您想通过myStateFlow.value 访问值,则必须运行协程才能从初始流中获取值并相应地设置状态。这实际上是stateIn 默认所做的:它启动一个协程,收集流来设置StateFlow 的值——所以它在技术上使用collect

【讨论】:

以上是关于有没有办法从 Flow 中创建 StateFlow的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Flow响应式编程,StateFlow和SharedFlow

Kotlin Flow响应式编程,StateFlow和SharedFlow

Simulink Stateflow:等待并行状态

谁能取代Android的LiveData- StateFlow or SharedFlow?

谁能取代Android的LiveData- StateFlow or SharedFlow?

有没有办法在 Android 的可穿戴设备中创建类似可拖动菜单的东西?