获取流程发出的最后一个项目,并且不接收更新

问题描述

在不接收更新的情况下获取流发出的最后一个元素的最佳方法是什么。

问题: 我使用流程观察某些共享首选项的更改,但有时我想知道该首选项的当前值。我总是使用两个函数,一个函数观察流中的值,另一个函数直接捕获数据,有没有办法仅使用观察者函数来归档相同的行为?

{{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,因此可能会进行改进和更改。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...