[Composable Navcontroller] NavigationUp 디버깅

정환·2024년 9월 20일

Android

목록 보기
2/2

1. 초기 코드

fun navigate

fun navigate(route: BottomMenuTabs) {
        if (route.qualifierName == navController.currentDestination?.route) return
        val navOptions = navOptions {
            popUpTo(navController.graph.id) {
                saveState = true //
                inclusive = false
            }
            launchSingleTop  = true
            restoreState = true
        }
        
        when (route) {
            BottomMenuTabs.HOME -> navController.navigateToHome(navOptions)
            BottomMenuTabs.PROFILE -> navController.navigateToProfile(navOptions)
            BottomMenuTabs.SESSION -> navController.navigateToSession(navOptions)
        }
    }

2. 문제 상황

navController에서 앞 두 route (Home, Profile)는 bottomBar을 통해 라우팅되는 스크린이고, session은 스택에 추가돼 이전 화면으로 뒤로가기가 가능해야 하는 화면이다. 하지만 sessionScreen으로 전달한 navigateUp()을 호출하자 뒤로가기 behavior가 잘 동작하지 않았다.

sessionScreen(
    modifier = Modifier.padding(it),
    navigateUp = {
         val res = tutrdNavController.navController.navigateUp()
         Log.d("@@@ROUTING", "backstack clicked with result: $res")
         // res는 navigateUp의 정상동작 여부의 boolean 값임
    })

3. 해결

Log의 결과가 처음 true 이후 계속 false가 출력되는 것으로 보아 스택에 Session Screen이 쌓이고 있지 않는 것 같았다. navigate된 화면은 스택에 쌓인다고 들었는데.? 그러면서 popUpTo 키워드의 의미를 다시 한번 찾아봤는데, 자세히 읽어보니 이 화면 전의 모든 스택을 말그대로 Pop해서 날려버리는 함수였다.

키워드 뜻을 깊이 생각해보지 않아서 생긴 문제라고 생각한다..^^

fun navigate(route: BottomMenuTabs) {
        if (route.qualifierName == navController.currentDestination?.route) return
        val navOptionsPopUp = navOptions {
            popUpTo(navController.graph.id) {
                saveState = true
                inclusive = false
            }
            launchSingleTop  = true
            restoreState = true
        }
        val navOptionsNoPopUp = navOptions {
            launchSingleTop  = true
            restoreState = true
        }
        when (route) {
            BottomMenuTabs.HOME -> navController.navigateToHome(navOptionsPopUp)
            BottomMenuTabs.PROFILE -> navController.navigateToProfile(navOptionsPopUp)
            BottomMenuTabs.SESSION -> navController.navigateToSession(navOptionsNoPopUp)
        }
    }

navOptions를 두 개로 나눠서 BottomBar 라우팅이랑 아닌 스크린을 구분지어서 해결했다.

profile
나만의 세계 만들어나가기

0개의 댓글