如何获得Flow的最新值?我没有需要这个最新价值的StateFlow。以下是浓缩的情景:
有一个存储库公开了一个StateFlow
val repositoryExposedStateFlow: StateFlow<SomeType> = MutableStateFlow(...)此外,还有一些映射程序转换了类似于StateFlow的
val mappedFlow: Flow<SomeOtherType> = repositoryExposedStateFlow.flatMapLatest { ... }mappedFlow不再是StateFlow,而是一个Flow。因此,当有StateFlow时,我无法获得最新的/当前的值。
无论如何,在某个时候,我需要Flow中的最新值。由于这一点不是在ViewModel中,而是在一些用例实现中,所以我不能简单地执行一个stateIn,并在ViewModel还活着的时候在ViewModel中保存最新的值--否则我必须将这个值传递给所有用例。实际上,在用例中,我触发了网络刷新,这会导致在StateFlow和mappedFlow上发出新的值。
不过,在用例中,我有CoroutineScopes。所以我想出了
suspend fun <T> Flow<T>.getState(): T {
return coroutineScope {
val result = stateIn(
scope = this
).value
coroutineContext.cancelChildren()
result
}
}如果不使用coroutineContext.cancelChildren(),该方法将永远不会返回,因为coroutineScope会阻塞调用方,直到所有子协同完成为止。由于stateIn从未完成,所以我手动取消了所有的子级。
显然这是件坏事。
但我怎样才能更好地解决这个问题呢?在我看来,这个问题源于StateFlow映射,从而导致了常规的Flow实例。
发布于 2022-10-21 15:17:24
是的,您所需要的只是在流中调用first()。因为它是由一个StateFlow上游支持的,所以first()调用将获得该支持StateFlow的当前值,运行它从下游操作符发生的任何转换,并返回该值。
这将有效地使您获得与上面的尝试相同的结果。
缺点是所有下游运算符都必须运行,因此它可能很昂贵。
这是可能的,只有当有一个上游StateFlow。否则,您将无法检索最新值的概念。
不过,我会对你获得最新价值的需求提出质疑。通常,您收集流,因此您已经在使用当前值。流是用于反应性编程的。
https://stackoverflow.com/questions/74155620
复制相似问题