为什么LaunchedEffect(真的)可疑?

Why is LaunchedEffect(true) suspicious?(为什么LaunchedEffect(真的)可疑?)
本文介绍了为什么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(真的)可疑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)