Как обратиться к вложенному графу из двух других графов в Compose Navigation Android

Есть нижняя навигация. Нужно попасть во вложенный граф (roomGraph) из двух разных графов (homeGraph и reservationGraph).

При переходе по нижней навигации, мы открываем новый граф, например reservationGraph, всплывая к графу нижней навигации bottomNavGraph.

popUpTo(navController.graph.startDestinationId)

Если разместить граф комнат в двух местах, вылетает ошибка что маршрут не найден. Если разместить граф комнат на уровне bottomNavGraph, тогда будет нарушена иерархия и подсветка активного пункта в нижней навигации пропадет (но стек сохранится, так как poUpTo не будет вызван).

private fun isSelected(currentDestination: NavDestination?, screen: Screen): Boolean {
    return currentDestination?.hierarchy?.any { it.route == screen.route } == true
}

Но нужно чтобы мы добавляли в иерархию вложенный граф и подсветка активного таба в навигации сохранялась.

//in activity
NavHost(
    navController = navController,
    startDestination = Screen.BottomNavGraph.route,
    route = Screen.App.route
) {
    bottomNavGraph(navController = navController)
}

fun NavGraphBuilder.bottomNavGraph(navController: NavHostController) {
    navigation(
        route = Screen.BottomNavGraph.route,
        startDestination = Screen.HomeGraph.route
    ) {
        homeGraph(navController = navController)
        reservationGraph(navController = navController)
        ...
    }
}

fun NavGraphBuilder.homeGraph(navController: NavHostController) {
    ...
    roomGraph(navController = navController)
}

fun NavGraphBuilder.reservationGraph(navController: NavHostController) {
    ...
    roomGraph(navController = navController)
}

//onClick in BottomNavigation
if (currentDestination?.route != screen.route) {
    navController.navigate(screen.route) {
        this.launchSingleTop = true
        this.restoreState = true
        popUpTo(navController.graph.startDestinationId) {saveState = true}
    }
}

При переходе из homeGraph, граф roomGraph виден, но при переходе из reservationGraph возникает ошибка.

java.lang.IllegalArgumentException: No destination with ID -1553965374 is on the NavController's back stack. The current destination is Destination(0x29ea2164) route=roomShared...

переход по нижней навигации

D/TAG_DEBUG_NAV: navController.graph.startDestinationRoute: bottomNavGraph
D/TAG_DEBUG_NAV: navController.graph.findStartDestination().route: home
D/TAG_DEBUG_NAV: navController.backQueue.first(): app
D/TAG_DEBUG_NAV: navController.currentDestination?.route: reservation
D/TAG_DEBUG_NAV: 0: entry.destination.route: app
D/TAG_DEBUG_NAV: 1: entry.destination.route: bottomNavGraph
D/TAG_DEBUG_NAV: 2: entry.destination.route: reservationGraph
D/TAG_DEBUG_NAV: 3: entry.destination.route: reservation

Как вложить граф в другие и при этом сохранить иерархию?


Ответы (0 шт):