为什么导航可组合项调用两次?

Сер*_*гей 8 android-jetpack-navigation

为什么导航可组合项调用两次?如果我在文本上设置断点,应用程序运行时我将停止两次。谢谢您的回答。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val navController = rememberNavController()
            var i: Int = 0
            NavHost(navController = navController, startDestination = "s1") {
                composable("s1") {
                    i++
                    Text("$i")

                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ucM*_*dia 0

NavHost可组合的,所以自然可以多次组合和重组!如果您想在可组合生命周期中执行一次性操作,请使用LaunchedEffect.

fun LaunchedEffect(
    vararg keys: Any?,
    block: suspend CoroutineScope.() -> Unit
)
Run Code Online (Sandbox Code Playgroud)

LaunchedEffect是一个可组合函数,因此它只能在其他可组合函数中使用。它用于触发副作用,仅当键更改时才执行一次。

更改您的代码如下:

     setContent {
        val navController = rememberNavController()
        var i: Int = 0
        NavHost(navController = navController, startDestination = "s1") {
            composable("s1") {
                LaunchedEffect(Unit){
                    i++
                }
                Text("$i")
            }
        }
Run Code Online (Sandbox Code Playgroud)

我使用Unit作为 LaunchedEffect 的参数。由于 LaunchedEffect 块每次参数更改时都会重新启动,因此它的块只会运行一次。

阅读本文更好地了解可组合项的生命周期