如何停止JetPack组合导航,每次点击两次可综合的综合作用以及为什么

发布于 2025-01-30 06:09:54 字数 656 浏览 3 评论 0原文

我已经创建了一个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") }

    }

}

我的问题是,当我单击导航项目时,composable()函数上的日志消息在logcat中每次单击两次。我可能错过了文档上的一些东西。为什么发生这种情况&我该如何修复?

I have created a Jetpack compose navigation as follows:

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") }

    }

}

My problem is when ever I click on a nav item, the log message on the composable() function is printed twice per click in logcat. I may have missed something on the documentation. Why is this happening & how can I fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉风有信 2025-02-06 06:09:54

您处于典型情况下,副作用。在此处查看使用重新组件的撰写文档:
https://developer.android.com/jetroid.com/jetroid.com/jetpose/jetpack/jetpack/compose/compose/mental-model#并行

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

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") }
    }
}

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

You are in a typical case with side effects. Check compose documentation with the recomposition here :
https://developer.android.com/jetpack/compose/mental-model#parallel

Based on your code, if you want to display the debug log once when click on the "Display account button" :

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") }
    }
}

You can also put the log in your "onClick" function.

绮烟 2025-02-06 06:09:54

我遇到了同样的问题,然后使用 navoptions

 navController.navigate(
                ...,
                navOptions = navOptions {
                    launchSingleTop = true
                }
            )

I had the same problem and I cal solve it using NavOptions

 navController.navigate(
                ...,
                navOptions = navOptions {
                    launchSingleTop = true
                }
            )
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文