本文介绍了为什么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
及其协程在两个变体中被取消:
- 传递的
key
参数已更改-在这种情况下,当前LaunchedEffect
将被取消,并将创建一个新参数。 LaunchedEffect
从生命树中删除,例如,如果您将其(或其任何级别的父级)放入if
块中,条件变为false
。
LaunchedEffect
的key
,则可以传递Unit
。任何其他常量,如您的案例中的true
,都被认为是可疑的,因为它不能在运行时更改,而且对任何程序员来说都可能看起来像复杂的逻辑。
这篇关于为什么LaunchedEffect(真的)可疑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!