为什么当我导航回来时第二次调用LaunchedEffect



我想显示一些数据并模拟加载。出于这个原因,我在第一个屏幕上使用LaunchedEffect。它工作正常,但当我添加导航时,LaunchedEffect会启动两次。

导航:第一(LaunchedEffect(->第二->返回第一次(LaunchedEffect再次发射(

我预计当我回到第一个屏幕时,LaunchedEffect不会启动,我会立即看到数据。

发射效果示例:

@Composable
fun FirstScreen(...) {
...
LaunchedEffect(Unit) {
state = State.Loading
delay(2_000L)
state = State.Success(...)
}
}

导航示例:

val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = FIRST_ROTE
) {
composable(FIRST_ROTE) { FirstScreen(...) }
composable(SECOND_ROTE) { SecondScreen(...) }
}

查看文档中的

要从可组合文件内部安全地调用suspend函数,请使用CCD_ 1可组合。当CCD_ 2进入构图时,它用作为参数传递的代码块启动一个协程。如果LaunchedEffect离开作文如果用不同的键重新组合LaunchedEffect,则现有的协同程序将已取消,新的挂起功能将在新的共同出游。

当您导航到另一个屏幕时,可组合内容将从合成中删除(这意味着它没有绘制(。这就是再次执行CCD_ 5的原因。

您可以使用视图中的状态模型来控制此执行。类似于:

@Composable
fun FirstScreen(vm: YourViewModel) {
LaunchedEffect(Unit) {
if (vm.someFlag == true) {
vm.someFlag = false
state = State.Loading
delay(2_000L)
state = State.Success(...)
}
}
}

最新更新