如何解决获取流程发出的最后一个项目,并且不接收更新
在不接收更新的情况下获取流发出的最后一个元素的最佳方法是什么。
问题: 我使用流程观察某些共享首选项的更改,但有时我想知道该首选项的当前值。我总是使用两个函数,一个函数观察流中的值,另一个函数直接捕获数据,有没有办法仅使用观察者函数来归档相同的行为?
{{1}}
解决方法
您可以使用Flow的asLiveData
扩展功能将Flow作为LiveData公开:
class MyViewModel: ViewModel {
...
val myFlowAsLiveData: LiveData<Breadcrumb> = myFlow.asLiveData()
...
}
然后您可以照常观察它,如果需要其当前值,只需使用其value
属性:
myViewModel.myFlowAsLiveData.value
,
考虑使用StateFlow
StateFlow
是最近添加到协程标准库中的新API。您可以像常规流程一样使用它,但是它还具有一个value
属性,该属性可以获取最新值。
目前,向状态流发送新值的唯一方法是更新其value
属性。尽管有open proposal for it,但您仍无法将常规流程转换为状态流程。
假设您将值发送到流程中,如下所示:
val breadcrumbs = MutableStateFlow(someValue)
launch {
while (isActive) {
waitForSomeCondition()
breadcrumbs.value = getLatestValue()
}
}
您可以随时获取最新值,例如:
launch {
while (isActive) {
delay(1000)
println("Current value is ${breadcrumbs.value}")
}
}
但是您也可以像常规流程一样收集它,并在每次更改时接收新值:
launch {
breadcrumbs.collect {
println("Current value is ${it}")
}
}
这是一个experimental API,因此可能会进行改进和更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。