Jetpack Compose:使用导航组件更改底部导航后按行为

M'a*_*der 6 android kotlin android-navigation android-jetpack-compose

我终于开始使用 Android 版 Compose,但目前陷入导航困境。我有两个问题:

1. 我实现了带有三个按钮的底部导航,其中一个按钮触发嵌套导航图,例如:

 HOME  ---  CONTACTS  ---  FAVOURITES 
   |            
DETAILS 
Run Code Online (Sandbox Code Playgroud)

因此,当我从主页打开详细信息屏幕并切换选项卡时,行为是正确的,嵌套图中的状态和最后目的地会被记住,当我再次点击主页时,它会保留状态并切换回详细信息。但是,如果我在任何其他选项卡上并按返回,它会将我带回到主页,但会重置状态,不会让我返回详细信息。我怎样才能做到这一点?

导航栏:

@Composable
fun BottomNavigationBar(navController: NavHostController) {
BottomNavigation {
    val backStackEntry by navController.currentBackStackEntryAsState()
    val currentRoute = backStackEntry?.destination?.route

    BottomNavigationCollection.items.forEach { navItem ->
        BottomNavigationItem(
            selected = currentRoute == navItem.route,
            onClick = {
                navController.navigate(navItem.route) {
                    popUpTo(navController.graph.findStartDestination().id) {
                        saveState = true
                    }
                    launchSingleTop = true
                    restoreState = true
                }
            },
            icon = {
                Icon(
                    imageVector = navItem.icon,
                    contentDescription = navItem.title
                )
            },
            label = {
                Text(text = navItem.title)
            },
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

导航主机:

@Composable
fun NavigationHost(navController: NavHostController) {
NavHost(
    navController = navController,
    startDestination = NavigationRoutes.Home.route,
    route = "root"
) {
    homeGraph(navController)

    composable(NavigationRoutes.Contacts.route) {
        ContactsScreen()
    }

    composable(NavigationRoutes.Favorites.route) {
        FavouritesScreen()
    }
}
Run Code Online (Sandbox Code Playgroud)

}

嵌套主页导航图:

fun NavGraphBuilder.homeGraph(navController: NavController) {
navigation(
    startDestination = NavigationRoutes.Dashboard.route,
    route = NavigationRoutes.Home.route
) {
    composable(NavigationRoutes.Dashboard.route) {
        DashboardScreen(navController)
    }

    composable(NavigationRoutes.Details.route) {
        DetailsScreen(navController)
    }
}
Run Code Online (Sandbox Code Playgroud)

}

2. 当我回到家里,整个导航堆栈都清晰并再次按下返回时,应用程序自然会关闭。我怎样才能拦截后按并在此时实现“再次点击退出”确认功能?

Sim*_*ays 1

我无法回答你的第一个问题,但对于你的第二个问题:我刚刚偶然发现了BackHandler。我只是快速尝试了一下,它被调用而不是关闭应用程序,所以这应该可以解决您的问题。