在不接收更新的情况下获取流发出的最后一个元素的最佳方法是什么。
**问题:**我使用流来观察某些共享首选项的变化,但有时我想知道该首选项的当前值。我总是使用两个函数,一个用来观察流中的值,另一个用来直接捕获数据,有没有办法只用observer函数来归档相同的行为?
suspend fun getBreadcrumb(): Breadcrumb =
withContext(Dispatchers.IO) context@ {
...
}
fun observeBreadcrumb(): Flow<Breadcrumb> {
....
}
4条答案
按热度按时间of1yzvn41#
考虑使用StateFlow
StateFlow
是最近添加到协程标准库中的新API。您可以像普通流一样使用它,但它也有一个value
属性,可以获取最新的值。目前,向状态流发送新值的唯一方法是更新其
value
属性。虽然有一个open proposal for it,但还不能将常规流转换为状态流。假设你像这样向流发送值:
您可以随时检索最新的值,例如:
但您也可以像常规流一样收集它,并在每次更改时接收新值:
这是一个experimental API,因此可能会有改进和更改。
t9eec4r02#
您可以使用Flow的
asLiveData
扩展函数将Flow公开为LiveData:然后你可以像往常一样观察它,如果你需要它的当前值,只需使用它的
value
属性:pftdvrlh3#
你用协程函数mapLatest试过了吗
fumotvh34#
应该使用
last()
或lastOrNull()
来实现这一点。