Android Jetpack Compose嵌套导航:切换顶级目标无法保存全部状态
嵌套导航图切换时状态无法全部保留
问题描述
我的应用中存在三个嵌套导航图:HomeGraph、ProfileGraph 和 MenuGraph。我希望通过BottomNavigationBar在这些导航图间切换时,每个导航图都能保留自身状态,并正确加入应用返回栈,避免影响用户体验。但使用官方推荐的状态保留导航方法时,仅能保留HomeGraph的状态,其余导航图的状态无法保存。我需要实现所有TopLevelDestination的状态保存与恢复。
有最小重现项目。
使用的官方推荐状态保留导航方法
fun NavController.navigateToTopLevelDestination(topLevelDestination: TopLevelDestination) { navigate(topLevelDestination.route) { popUpTo(graph.findStartDestination().id) { saveState = true } launchSingleTop = true restoreState = true } }
导航配置
NavHost( navController = navController, startDestination = Destination.HomeDestination.HomeGraph, modifier = Modifier.padding(padding) ) { homeGraph(navController) profileGraph(navController) menuGraph(navController) }
导航图示例结构(以HomeGraph为例)
fun NavGraphBuilder.homeGraph(navController: NavController) { navigation<HomeDestination.HomeGraph>(startDestination = HomeDestination.Home1) { composable<HomeDestination.Home1> { Column( Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(HomeDestination.Home1.toString()) Button(onClick = { navController.navigate(HomeDestination.Home2) }) { Text("Next") } } } composable<HomeDestination.Home2> { Column( Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(HomeDestination.Home2.toString()) Button(onClick = { navController.navigate(HomeDestination.Home3) }) { Text("Next") } } } composable<HomeDestination.Home3> { Column( Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(HomeDestination.Home3.toString()) } } } }
TopLevelDestination定义
enum class TopLevelDestination(val route: Destination, val icon: ImageVector) { HOME(Destination.HomeDestination.HomeGraph, icon = Icons.Default.Home), PROFILE(Destination.ProfileDestination.ProfileGraph, icon = Icons.Default.Person), MENU(Destination.MenuDestination.MenuGraph, icon = Icons.Default.Menu) }
内容的提问来源于stack exchange,提问作者Sevban Bayır
相关产品推荐
相关产品推荐

