You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:58:13