如何在 Jetpack Compose 中使用 SharedFlow

srv*_*rvy 7 android kotlin-coroutines android-jetpack-compose kotlin-flow

通过状态流我可以使用

val items by myViewModel.items.collectAsState()
Run Code Online (Sandbox Code Playgroud)

我想共享流不能以这种方式使用。共享流是否适用于 Compose?

Moh*_*aki 12

SharedFlow 应该用于一次性事件(导航、吐司等)。

所以这是收集 SharedFlow 的方法:

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

  • 如何在 Compose 中调用它的真实代码示例是什么? (4认同)

Phi*_*hov 3

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

flow.collectAsState(initial = 0)
Run Code Online (Sandbox Code Playgroud)

此状态将具有视图呈现期间流发出的最后一个值或初始值。不过,我不确定这是否有意义。

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