공부/Android
[Compose] navigate, 네비게이션 바 이동시 이전 화면 모두 지우기
데자와 맛있다
2023. 9. 16. 17:41
//백스택에 home 라우트 직전까지 쌓인것들을 다 지운다 그 다음에 friendslist를 백스택에 쌓는다
// home|friendslist 이런모양이됨
// freindslist에서 뒤로가기 하면 home으로 이동
navController.navigate("friendslist") {
popUpTo("home")
}
// home까지 포함해서 스택에 쌓인것을을 지운다 그다음 friendslist를 백스택에 넣는다
// 그러면 이 경우 friendslist에서 뒤로가기하면 바로 앱이 종료
navController.navigate("friendslist") {
popUpTo("home") { inclusive = true }
}
// 백스택의 최상단에 search가 이미 있다면 걔를 재사용함, 새로 안만든다
navController.navigate("search") {
launchSingleTop = true
}
fun MainBottomNavigationBar(navController: NavHostController) {
val bottomNavigationItems = listOf(
BottomNav.Home,
BottomNav.Setting
)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
NavigationBar(
containerColor = HabitPurpleNormal,
tonalElevation = 0.dp,
modifier =
Modifier
.graphicsLayer {
shape = RoundedCornerShape(
topStart = 16.dp,
topEnd = 16.dp
)
clip = true
shadowElevation = 20f
}
) {
bottomNavigationItems.forEach { item ->
Spacer(modifier = Modifier.size(4.dp))
NavigationBarItem(
colors = NavigationBarItemDefaults.colors(
selectedIconColor = HabitWhite,
selectedTextColor = HabitWhite,
unselectedIconColor = HabitBlueGray,
unselectedTextColor = Color.Transparent,
indicatorColor = HabitPurpleNormal
),
label = {
Text(text = item.title)
},
icon = { Icon(painter = painterResource(id = item.icon), item.title) },
selected = currentRoute == item.route, //언제 selected 상태가 되는지
onClick = { //네비게이션 아이템 클릭시
navController.navigate(item.route){
if(currentRoute.toString() != item.route){ // 가장 최근 화면이 이동 목적지와 다른 경우에만
popUpTo(currentRoute.toString()){ inclusive = true } // 스택에 있는 가장 최근 화면 제거
}else{ // 가장 최근 화면이 이동 목적지와 동일한경우 새로 쌓지 않고 재사용
launchSingleTop = true
}
}
})
}
}
}