android 获取流发出的最后一个项目,但不接收更新

z9gpfhce  于 2023-09-28  发布在  Android
关注(0)|答案(4)|浏览(97)

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

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

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

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

of1yzvn41#

考虑使用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,因此可能会有改进和更改。

t9eec4r0

t9eec4r02#

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

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

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

myViewModel.myFlowAsLiveData.value
pftdvrlh

pftdvrlh3#

你用协程函数mapLatest试过了吗

val breadcrumbs = MutableStateFlow(someValue)

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

fumotvh34#

应该使用last()lastOrNull()来实现这一点。

相关问题