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)
}
}
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 값임
})
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 라우팅이랑 아닌 스크린을 구분지어서 해결했다.