【发布时间】:2022-10-07 11:26:25
【问题描述】:
我正在使用 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) 与 while(true) 一样可疑。即使它有有效的用例,也请始终暂停并确保这是您所需要的。
我的问题是:
LaunchedEffect究竟何时被取消?文档说它与调用站点的生命周期相匹配。这就是这种情况下的组成吗?- 考虑到官方文档有警告吗?我不应该使用这个
LaunchedEffect(true)设置来观察我的项目的副作用吗?什么是替代方案?
-
请不要在一个问题中提出多个问题。其他人很难找到所需的答案。见How do I ask a good question。我已经回答了你关于
LaunchedEffect的问题,关于MVI 的部分超出了这个问题的范围,你可以创建另一个。 -
我把这些问题放在一起,因为它们是相互关联的。我可以删除关于 MVI 的最后一个,但如果我单独询问第二个可能会被认为是固执己见。
-
Google 在
produceState中使用LaunchedEffect(Unit) {,因此可以轻松地完全忽略此警告,尽管您应该始终确保您实际上不需要任何键来取消和重新启动协程。
标签: android android-jetpack-compose