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

Get last item emited by a Flow and dont receive updates

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

问题: 我使用流来观察某些共享偏好的变化,但有时我想知道该偏好的当前值。我总是使用两个函数,一个用于观察流中的值,另一个用于直接捕获数据,有没有什么方法可以仅使用观察者函数来存档相同的行为?

suspend fun getBreadcrumb(): Breadcrumb =
        withContext(Dispatchers.IO) context@ {
            ...
        }

fun observeBreadcrumb(): Flow<Breadcrumb> {
        ....
    }

您可以使用 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,因此可能会有改进和变化。

你试过协程函数吗mapLatest

val breadcrumbs = MutableStateFlow(someValue)

breadcrumbs.mapLatest { breadcrumb ->
  println("Latest value is ${breadcrumb}")
}