2

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

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

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

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

3 回答 3

7

考虑使用StateFlow

StateFlow是最近添加到协程标准库中的新 API。您可以像常规流一样使用它,但它也有一个value获取最新值的属性。

目前,向状态流发送新值的唯一方法是更新其value属性。您还不能将常规流转变为状态流,尽管有一个开放的提案

假设您像这样向流发送值:

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}")
    }
}

这是一个实验性API,因此可能会有改进和更改。

于 2020-08-31T07:21:21.063 回答
4

asLiveData您可以使用 Flow 的扩展功能将 Flow 公开为 LiveData :

class MyViewModel: ViewModel {
    ...
    val myFlowAsLiveData: LiveData<Breadcrumb> = myFlow.asLiveData()
    ...
}

然后你可以像往常一样观察它,如果你需要它的当前值,只需使用它的value属性:

myViewModel.myFlowAsLiveData.value
于 2020-08-31T03:00:02.800 回答
0

您是否尝试过使用协程函数mapLatest

val breadcrumbs = MutableStateFlow(someValue)

breadcrumbs.mapLatest { breadcrumb ->
  println("Latest value is ${breadcrumb}")
}
于 2021-11-24T22:26:18.420 回答