有没有办法从 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
谁能取代Android的LiveData- StateFlow or SharedFlow?