简体   繁体   English

如何在底部导航 Jetpack Compose 中保存嵌套导航图 id 的目的地?

[英]How can be saved the destinations of nested navigation graph's id in the bottom navigation Jetpack Compose?

I am facing some problems with navigation's back stacks in Jetpack Compose.我在 Jetpack Compose 中遇到了导航返回堆栈的一些问题。 The following diagram is my desired scenario.下图是我想要的场景。 在此处输入图像描述

I have bottom bar and two items Home and Setting.我有底栏和两个项目主页和设置。 And I want to make both as nested graphs.我想把它们都做成嵌套图。 In HomeNavGraph, HomeRootScreen is startDestination and can navigate to HomeDetail1Screen and HomeDetail2.在 HomeNavGraph 中,HomeRootScreen 是 startDestination,可以导航到 HomeDetail1Screen 和 HomeDetail2。 Setting tab also likes that.设置选项卡也很喜欢。 And I want to save those nested graph states like When I click HomeRoot -> HomeDetail1 -> HomeDetail2, at that time I click Setting tab in BottomBar.我想保存那些嵌套的图形状态,例如当我单击 HomeRoot -> HomeDetail1 -> HomeDetail2 时,当时我单击 BottomBar 中的设置选项卡。 And click back to Home, I want my current Screen to HomeDeatil2Screen.然后单击返回主页,我希望我当前的屏幕为 HomeDeatil2Screen。

The followings are my codes.以下是我的代码。 This is my Destination class.这是我的目的地 class。

    sealed class Destinations(
    val route: String
) {
    object HomeRoot : Destinations(route = "home_root_screen")
    object HomeDetail1 : Destinations(route = "home_detail1_screen")
    object HomeDetail2 : Destinations(route = "home_detail2_screen")

    object SettingRoot : Destinations(route = "setting_root_screen")
    object SettingDetail1 : Destinations(route = "setting_detail1_screen")
    object SettingDetail2 : Destinations(route = "setting_detail2_screen")
}

const val BOTTOM_NAV_ROUTE = "btn_nav"
const val HOME_ROUTE = "home"
const val SETTING_ROUTE = "setting"

This is my BottomBarNavGraph.这是我的 BottomBarNavGraph。

@Composable
fun BottomBarNavGraph(
    navController: NavHostController
) {
    NavHost(
        navController = navController,
        startDestination = HOME_ROUTE,
        route = BOTTOM_NAV_ROUTE
    ) {
        homeNavGraph(navController)
        settingNavGraph(navController)
    }
}

This is HomeNavGraph.这是 HomeNavGraph。

fun NavGraphBuilder.homeNavGraph(
    navController: NavHostController
) {
    navigation(
        startDestination = Destinations.HomeRoot.route,
        route = HOME_ROUTE
    ) {
        composable(route = Destinations.HomeRoot.route) { HomeScreen(navController = navController) }
        composable(route = Destinations.HomeDetail1.route + "/{argText}") {
            val arg = it.arguments?.getString("argText") ?: "Nothing Typed"
            HomeDetail1Screen(
                text = arg,
                navController = navController
            )
        }
        composable(route = Destinations.HomeDetail2.route) { HomeDetail2Screen(navController = navController) }
    }
}

This is SettingNavGraph.这是设置导航图。

fun NavGraphBuilder.settingNavGraph(
    navController: NavHostController
) {
    navigation(
        startDestination = Destinations.SettingRoot.route,
        route = SETTING_ROUTE
    ) {
        composable(
            route = Destinations.SettingRoot.route
        ) {
            SettingScreen(navController = navController)
        }
        composable(
            route = Destinations.SettingDetail1.route
        ) {
            SettingDetail1Screen(navController = navController)
        }
        composable(
            route = Destinations.SettingDetail2.route
        ) {
            SettingDetail2Screen(navController = navController)
        }
    }

}

This is my BottomBarDestinations.这是我的 BottomBarDestinations。

sealed class BottomBarDestinations(
    val route: String,
    val title: String,
    val icon: ImageVector

) {
    object Home : BottomBarDestinations(
        route = HOME_ROUTE,
        title = "Home",
        icon = Icons.Default.Home
    )

    object Setting : BottomBarDestinations(
        route = SETTING_ROUTE,
        title = "Setting",
        icon = Icons.Default.Settings
    )
}

The followings are my setup of BottomBar in navHost.以下是我在 navHost 中对 BottomBar 的设置。

@Composable
fun BottomBar(navController: NavHostController) {
    val screens = listOf(
        BottomBarDestinations.Home,
        BottomBarDestinations.Setting
    )
    val navBackStackEntry by navController.currentBackStackEntryAsState()
    val currentDestinations = navBackStackEntry?.destination

    BottomNavigation {
        screens.forEach {
            AddItem(
                screen = it,
                currentDestinations = currentDestinations,
                navController = navController
            )
        }
    }
}

@Composable
fun RowScope.AddItem(
    screen: BottomBarDestinations,
    currentDestinations: NavDestination?,
    navController: NavHostController
) {
    BottomNavigationItem(
        label = {
            Text(text = screen.title)
        },
        icon = {
            Icon(
                imageVector = screen.icon,
                contentDescription = "Nav Icon"
            )
        },
        selected = currentDestinations?.hierarchy?.any { it.route == screen.route } == true,
        unselectedContentColor = LocalContentColor.current.copy(
            alpha = ContentAlpha.disabled
        ),
        onClick = {
            navController.navigate(screen.route) {
                popUpTo(navController.graph.findStartDestination().id)
                launchSingleTop = true
                restoreState = true
            }
        }
    )
}

@Composable
fun MainScreen(
) {
    val navController = rememberNavController()
    Scaffold(bottomBar = {
        BottomBar(navController = navController)
    }) {
        BottomBarNavGraph(navController = navController)
    }
}

Please help me with this.请帮我解决一下这个。 I stack with this.我和这个叠加。 If you want to check the source code.如果你想查看源代码。 You can check this in branch你可以在分支机构检查这个

bottom_nav_graph底部导航图

https://github.com/kyawlinnthant/JetpackComposeNavigationComponent/tree/nested_graph https://github.com/kyawlinnthant/JetpackComposeNavigationComponent/tree/nested_graph

If you need to save state of route (Screen) or graph, you need to use following technique:如果你需要保存 state 的路线(屏幕)或图表,你需要使用以下技术:

navController.navigate(screen.route) {
                popUpTo(navController.graph.findStartDestination().id){
                    inclusive = true
                    saveState = true
                }
                launchSingleTop = true
                restoreState = true
            }

BTW, I can't use顺便说一句,我不能用

navController.graph.findStartDestination().id

I specify the start destination by myself (in your case will be "home_root_screen").我自己指定起始目的地(在你的情况下将是“home_root_screen”)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将参数传递给 Jetpack Compose 中的嵌套导航图 - Pass an argument to a nested navigation graph in Jetpack Compose Jetpack Compose - 如果有嵌套导航,则不选择底部导航图标 - Jetpack Compose - Bottom navigation icon is not selected if it has nested navigation Jetpack Compose Navigation:直接导航以在不是 startDestination 的嵌套图中路由 - Jetpack Compose Navigation: Direct navigation to route in a nested graph which is not startDestination Jetpack compose:如何使用动画、嵌套导航和允许视图模型在模态底部表中实现导航 - Jetpack compose: How to implement navigation in Modal Bottom sheet with animation, Nested navigation and allow viewmodel Jetpack Compose - 底部导航栏不显示嵌套的 navGraph - Jetpack Compose - Bottom navigation bar isn't showing with nested navGraph Jetpack Compose 嵌套导航和 BottomAppBar - Jetpack Compose nested navigation and BottomAppBar Jetpack Compose & Navigation:问题在嵌套图中共享 ViewModel - Jetpack Compose & Navigation: Problems share ViewModel in nested graph Jetpack Compose + Navigation - 使用 BottomNavBar 的嵌套导航 - Jetpack Compose + Navigation - Nested navigation with BottomNavBar 如何在 Android Jetpack Compose 中进行圆底导航 - How to make rounded bottom navigation in Android Jetpack Compose Jetpack Compose – BottomBar 在底部导航下方 - Jetpack Compose – BottomBar is under Bottom Navigation
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM