如何停止 Jetpack Compose Navigation 每次点击执行两次可组合项以及原因

Nic*_*Nic 15 navigation android android-jetpack-compose

我创建了一个 Jetpack 撰写导航,如下所示:

val navController = rememberNavController()

Scaffold(
    bottomBar = { /* BottomBar code here */ }
){ innerPadding ->

    NavHost(
         navController = navController,
         startDestination = "navigation",
         modifier = Modifier.padding(innerPadding)
    ){

        composable("home") { Log.d(TAG, "Show home screen") }

        composable("account") { Log.d(TAG, "Show account screen") }

        composable("settings") { Log.d(TAG, "Show settings screen") }

    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,每当我单击导航项时,composable()每次单击 logcat 中该函数的日志消息都会打印两次。我可能错过了文档中的一些内容。为什么会发生这种情况以及如何解决?

小智 1

您属于典型的副作用案例。在此处检查组合文档和重组: https ://developer.android.com/jetpack/compose/mental-model#parallel

根据您的代码,如果您想在单击“显示帐户按钮”时显示一次调试日志:

val navController = rememberNavController()

Scaffold(
    bottomBar = {
        Button(onClick = { navController.navigate("account") }) {
            Text(text = "Display account")
        }
    }
){ innerPadding ->
    NavHost(
        navController = navController,
        startDestination = "navigation",
        modifier = Modifier.padding(innerPadding)
    ){
        composable("home") { Log.d(TAG, "Show home screen") }
        composable("account") {
            val isLogPrinted = remember { mutableStateOf(false) }
            if (!isLogPrinted.value) {
                Log.d(TAG, "Show account screen")
                isLogPrinted.value = true
            }
        }
        composable("settings") { Log.d(TAG, "Show settings screen") }
        composable("navigation") { Log.d(TAG, "Show navigation screen") }
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以将日志放入“onClick”函数中。