- экран A (главный экран, имеет 3 кнопки для перехода к B, C и D)
- экран B (имеет 3 кнопки для перехода к A, C и D)
- экран C (имеет 3 кнопки для перехода к A, B и D)
- экран D (имеет 3 кнопки для перехода к A, B и C)
Задний стек должен стать A > C > D > B. И когда пользователь переходит к экрану A, задний стек очищается. Когда пользователь нажимает кнопку «Назад», текущий экран выскакивает.
Я думал, что launchSingleTop = true решит эту проблему, но на самом деле это просто гарантирует отсутствие повторяющиеся пункты назначения рядом друг с другом.
Это мой текущий код на экране A для перехода к другим экранам:
Код: Выделить всё
composable {
val lifecycleOwner = LocalLifecycleOwner.current
ScreenA(
onNavigate = {
val currentState = lifecycleOwner.lifecycle.currentState
if (currentState.isAtLeast(Lifecycle.State.RESUMED)) {
navController.navigate(route = it.route) {
launchSingleTop = true
}
}
},
onCloseApp = {
if (context is Activity) {
context.finish()
}
}
)
}
Код: Выделить всё
composable {
val lifecycleOwner = LocalLifecycleOwner.current
ScreenB(
onNavigate = {
val currentState = lifecycleOwner.lifecycle.currentState
if (currentState.isAtLeast(Lifecycle.State.RESUMED)) {
when (it.route) {
Route.ScreenA -> {
navController.navigate(route = Route.ScreenA) {
launchSingleTop = true
// to remove all screens from the back stack except screenA
popUpTo(Route.ScreenA) { inclusive = false }
}
}
else -> {
navController.navigate(route = it.route) {
launchSingleTop = true
}
}
}
}
},
onNavigateBack = {
val currentState = lifecycleOwner.lifecycle.currentState
if (currentState.isAtLeast(Lifecycle.State.RESUMED)) {
navController.popBackStack()
}
}
)
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... back-stack