为什么LaunchedEffect(真的)可疑? [英] Why is LaunchedEffect(true) suspicious?

查看:27
本文介绍了为什么LaunchedEffect(真的)可疑?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Compose实现MVI。为了遵循正确的事件循环,我需要通过我的视图模型传播点击事件,然后观察副作用。我看了几个实现,它们都使用LaunchedEffect(true)来观察副作用并采取行动。

我有一个类似的设置,例如:

@Composable
fun HelloComposeScreen(
    viewModel: MyViewModel = hiltViewModel(),
    onClickedNext: () -> Unit
) {
    LaunchedEffect(true) {
        viewModel.sideEffect.collectLatest { sideEffect ->
            when (sideEffect) {
                DashboardSideEffect.CreateParty -> onClickedNext()
            }
        }
    }
    Button(
        onClick = { viewModel.onEvent(UserEvent.ClickedButton)},
    ) {
        Text("Click Me")
    }
}

这会导致我对任何具有导航或一次性事件的屏幕使用LaunchedEffect(true),但official documentation有此警告

警告:LaunchedEffect(TRUE)像一段时间(TRUE)一样可疑。即使它有有效的用例,也要始终暂停并确保这是您所需要的。

我的问题是:

  • 取消LaunchedEffect的确切时间是什么时候?文档说它与调用站点的生命周期相匹配。这就是本例中的作文吗?
  • 考虑到官方文件中有警告吗?我不应该使用这个LaunchedEffect(true)设置来观察我的项目的副作用吗?有什么替代方案?

推荐答案

LaunchedEffect及其协程在两个变体中被取消:

  1. 传递的key参数已更改-在这种情况下,当前LaunchedEffect将被取消,并将创建一个新参数。
  2. LaunchedEffect从生命树中删除,例如,如果您将其(或其任何级别的父级)放入if块中,条件变为false
如果您不需要传递任何应重新启动LaunchedEffectkey,则可以传递Unit。任何其他常量,如您的案例中的true,都被认为是可疑的,因为它不能在运行时更改,而且对任何程序员来说都可能看起来像复杂的逻辑。

这篇关于为什么LaunchedEffect(真的)可疑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆