如何在 Jetpack Compose 中使用 SharedFlow

5

使用状态流,我可以:

val items by myViewModel.items.collectAsState()

我认为共享流无法以这种方式使用。 共享流是否适用于Compose?

2个回答

10

SharedFlow 应该用于一次性事件(如导航、提示等)。

所以这是收集 SharedFlow 的方法:

@Composable
fun <T> Flow<T>.collectAsEffect(
    context: CoroutineContext = EmptyCoroutineContext,
    block: (T) -> Unit
) {
    LaunchedEffect(key1 = Unit) {
        onEach(block).flowOn(context).launchIn(this)
    }
}

3
这个在Compose中如何调用的真实代码示例是什么? - IgorGanapolsky

3

从技术上讲,您可以像收集任何其他的Flow一样将其作为状态收集-具有初始值:

flow.collectAsState(initial = 0)

这个状态将拥有在视图呈现期间流所发出的最后一个值,或者是初始值。虽然我不确定这是否有太多意义。

但是你也可以将其用作传递需要一次性响应的事件的方式,如此答案所示。


我们可以从另一个 ViewModel 中收集这个 Flow 吗? - IgorGanapolsky
@IgorGanapolsky 我不确定我理解了这个问题。从技术上讲,您可以将流传递到另一个视图模型函数,并在那里使用viewModelScope进行收集,但我认为最好使用一些其他类来共享您的视图模型之间的作用域,例如repository。 - Phil Dukhov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接