12

我正在使用compose-navigation(alpha09) 来处理可组合项之间的导航

我想在移动到下一个目的地时删除启动画面(我不希望后按回到启动画面)

以下尝试未按预期工作:

navHostController.navigate(Route.login.id) {
    navHostController.graph.clear()
}
navHostController.navigate(Route.login.id)
navHostController.graph.clear()
val currentDest = navHostController.currentDestination
navHostController.navigate(Route.login.id)
if (currentDest != null) {
   navHostController.graph.remove(currentDest)
}

那么如何删除启动画面然后移至下一个?

4

5 回答 5

22

在 Jetpack Compose1.0.0-rc01中导航并从后台堆栈中删除以前的 Composable 您可以使用:

navController.navigate(Screens.Login.name) {
    popUpTo(Screens.Splash.name) {
        inclusive = true
    }
}

上面的代码将从Splash屏幕导航到Login并弹出所有内容,包括Splash屏幕。

导航到可组合 - 文档

于 2021-07-08T14:55:16.310 回答
11

对于v1.0.0-alpha09

使用popUpTo(0)您可以在导航到下一个目的地之前清除堆栈。所以:

navHostController.navigate(Route.login.id) {
    // popUpTo = 0 // DEPRECATED
    popUpTo(0)
}
于 2021-03-28T20:28:36.223 回答
2

对于不需要知道当前路由的一致可重用函数,请使用此 NavOptionsBuilder 扩展函数

fun NavOptionsBuilder.popUpToTop(navController: NavController) {
    popUpTo(navController.currentBackStackEntry?.destination?.route ?: return) { 
        inclusive =  true
    }
}

^ 与其他答案类似,它 popUpTo 当前路由,但不需要命名特定的当前路由,而是从 backstack 条目中获取它。

现在你可以像这样使用它:

navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }

^ 该示例导航到 Login,并且应该清除它之前的整个 backstack。

于 2022-02-17T21:04:58.103 回答
1

用于清除所有回栈

要从堆栈中删除多个可组合屏幕,请使用以下代码段

navController.navigate(ScreenRoutes.Login.route){
                    popUpTo(navController.graph.findStartDestination().id){
                        inclusive = true  }}

或将 Home 保留在后堆栈中

navController.navigate(ScreenRoutes.SelectCourseLayout.route){
    popUpTo(ScreenRoutes.Home.route)
}
于 2021-09-20T10:58:04.800 回答
0

喷气背包组成v1.0.5

navController.backQueue.removeIf { it.destination.route == "Splash" }
navController.popBackStack()
于 2022-01-04T02:04:45.703 回答