Я ожидаю, что BackHandler будет работать, когда NavigationDrawer закрыт, а NavHost показывает конкретный пункт назначения.
У меня есть код (минимальный):
Манифест
Код: Выделить всё
android:enableOnBackInvokedCallback="true"
Код: Выделить всё
val navController = rememberNavController()
val currentDestination by navController.currentBackStackEntryAsState()
val isDisabledScreen = remember(currentDestination) {
currentDestination?.toRoute() != null
}
val drawerState = rememberDrawerState(DrawerValue.Closed)
val canOverrideBack = remember(
drawerState.isClosed,
isDisabledScreen,
) {
drawerState.isClosed && isDisabledScreen
}
BackHandler(enabled = canOverrideBack) {
context.findActivity()?.finish()
}
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
ModalDrawerSheet(
drawerState = drawerState,
) {
// ...
}
}
) {
Scaffold(
) {
NavHost(
navController = navController,
startDestination = HomeDestination,
) {
HomeScreen()
DisabledScreen()
// ...
}
}
}
Но это не работает ни в одном из следующих случаев:
- On DisabledDestination и drawerState.isClosed:
Здесь NavHost обрабатывает обратное событие, и пользователь переходит к startDestination. - В DisabledDestination и drawerState.isOpen:
Здесь NavHost обрабатывает обратное событие, и пользователь переходит к startDestination.
TLDR: я ожидаю, что приложение закроется, если указано DisabledDestination, но также закроет NavigationDrawer, если открыть перед закрытием приложения (которое встроено и работает, но в неправильном месте), и пользователь никогда не должен видеть startDestination, если когда-либо попадет в DisabledDestination.
Подробнее здесь: https://stackoverflow.com/questions/792 ... se-android
Мобильная версия