首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索非StateFlow的流的最新值

检索非StateFlow的流的最新值
EN

Stack Overflow用户
提问于 2022-10-21 15:02:15
回答 1查看 42关注 0票数 0

如何获得Flow的最新值?我没有需要这个最新价值的StateFlow。以下是浓缩的情景:

有一个存储库公开了一个StateFlow

代码语言:javascript
复制
val repositoryExposedStateFlow: StateFlow<SomeType> = MutableStateFlow(...)

此外,还有一些映射程序转换了类似于StateFlow

代码语言:javascript
复制
val mappedFlow: Flow<SomeOtherType> = repositoryExposedStateFlow.flatMapLatest { ... }

mappedFlow不再是StateFlow,而是一个Flow。因此,当有StateFlow时,我无法获得最新的/当前的值。

无论如何,在某个时候,我需要Flow中的最新值。由于这一点不是在ViewModel中,而是在一些用例实现中,所以我不能简单地执行一个stateIn,并在ViewModel还活着的时候在ViewModel中保存最新的值--否则我必须将这个值传递给所有用例。实际上,在用例中,我触发了网络刷新,这会导致在StateFlowmappedFlow上发出新的值。

不过,在用例中,我有CoroutineScopes。所以我想出了

代码语言:javascript
复制
suspend fun <T> Flow<T>.getState(): T {
    return coroutineScope {
        val result = stateIn(
            scope = this
        ).value
        coroutineContext.cancelChildren()

        result
    }
}

如果不使用coroutineContext.cancelChildren(),该方法将永远不会返回,因为coroutineScope会阻塞调用方,直到所有子协同完成为止。由于stateIn从未完成,所以我手动取消了所有的子级。

显然这是件坏事。

但我怎样才能更好地解决这个问题呢?在我看来,这个问题源于StateFlow映射,从而导致了常规的Flow实例。

EN

回答 1

Stack Overflow用户

发布于 2022-10-21 15:17:24

是的,您所需要的只是在流中调用first()。因为它是由一个StateFlow上游支持的,所以first()调用将获得该支持StateFlow的当前值,运行它从下游操作符发生的任何转换,并返回该值。

这将有效地使您获得与上面的尝试相同的结果。

缺点是所有下游运算符都必须运行,因此它可能很昂贵。

这是可能的,只有当有一个上游StateFlow。否则,您将无法检索最新值的概念。

不过,我会对你获得最新价值的需求提出质疑。通常,您收集流,因此您已经在使用当前值。流是用于反应性编程的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74155620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档