【发布时间】:2022-11-10 12:55:26
【问题描述】:
如何获得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 实例。
【问题讨论】:
-
“如何获取 Flow 的最新值?” - 你没有,除非你自己在某个地方缓存它。 “我在某个时候需要那个流中的最新值”——也许解决方案是重新审视这个假设。
-
是的,感觉就像我在另一个地方做错了什么。请参阅与@Tenfour04 的讨论,我们正在尝试找出答案。
标签: android kotlin kotlin-flow stateflow