Jetpack Compose导航popUpTo包含true时未从后退栈清除可组合屏幕

8

我正在使用Jetpack Compose ui版本1.3.0-beta08和navigation compose版本2.4.0-alpha02,并使用所有新的架构组件在Bloom应用上工作。登录成功后,我需要清除所有以前的Compose登录屏幕,但即使添加了popUpTo("HomeScreen"){inclusive = true},我的登录屏幕仍从返回堆栈中删除,但登录欢迎屏幕没有从返回堆栈中删除,当我从主屏幕点击返回时。在Compose Navigation中有什么我错过或者做错了吗?

composable(Screen.LoginScreen.route) {
                LoginScreen {
                    Log.d("AppMainNavigation", "AppMainNavigation: ${navController.backQueue}")
                    navController.navigate(Screen.HomeBaseScreen.route){
                        popUpTo(Screen.LoginScreen.route){
                            inclusive = true
                        }
                        launchSingleTop = true
                    }
                }
            }

GitHub链接: https://github.com/rramprasad/BloomApp/blob/main/app/src/main/java/dev/ramprasad/bloom/MainActivity.kt

该链接指向一个名为 "BloomApp" 的存储库,在其中找到了 "MainActivity.kt" 文件。

1
链接无效。 - Haris
1
尝试使用 popUpTo(0)。弹出将尝试从后堆栈中弹出所有不匹配的目标,直到找到此目标为止。为使其正常工作,0 ID 不得在后堆栈中。 - Iglesias Leonardo
2个回答

2

将您的Jetpack Compose版本更新为最新的预览版本,并更新所有其他依赖项。 当前Jetpack Compose版本:1.0.0-rc02

同时,如果您想要弹出哪个屏幕,请使用以下代码:

我的启动屏幕代码:

 @Composable
 fun Navigate(navController: NavController) {
    produceState(initialValue = -1) {
        delay(1500)
        navController.popBackStack()
        val route = if (Firebase.auth.currentUser == null) AppRouter.Intro.route else AppRouter.Home.route
        navController.navigate(route)
    }
 }

在这里,您可以使用以下代码行从后堆栈中移除屏幕:

navController.popBackStack()

不幸的是,这并没有帮助。 我的情况是 - 我有一个抽屉和几个项目。我希望每个项目都可以清除后退堆栈。因此,当用户在该屏幕上单击返回时,他会结束应用程序。 作为最后的手段,我将侦听后退点击...但理想情况下,希望通过导航解决这个问题。 - rocknow
@rocknow 你解决了吗? - Gunhan
@rocknow,你找到了吗? - Ammar

0
使用WelcomeScreen的路由作为popUpTo函数的参数。它会清除WelcomeScreen之前的所有后退栈条目,如果inclusive = true,则也包括WelcomeScreen本身。
navController.navigate(Screen.HomeBaseScreen.route) {
    popUpTo(Screen.WelcomeScreen.route) { inclusive = true }
}

此外,如果您在路由中使用参数,您也必须在popUpTo中使用它们。
navController.navigate(Screen.HomeBaseScreen.route) {
    popUpTo(Screen.WelcomeScreen.route + "/{someId}") { inclusive = true }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接