Как правильно обрабатывать обратное событие в Jetpack Compose Android?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как правильно обрабатывать обратное событие в Jetpack Compose Android?

Сообщение Anonymous »

У меня есть особый случай, когда мне нужно переопределить поведение возврата по умолчанию только при выполнении условия, и я его реализовал, но оно не работает, когда NavigationDrawer открыт!
Я ожидаю, что 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()
// ...
}
}
}
и мой начальный пункт назначения — HomeDestination. При запуске приложения пользователь будет перенаправлен в DisabledDestination, если будет выполнено определенное условие. Теперь, если в DisabledDestination при нажатии кнопки «Назад» приложение должно выйти/завершиться.
Но это не работает ни в одном из следующих случаев:
  • On DisabledDestination и drawerState.isClosed:
    Здесь NavHost обрабатывает обратное событие, и пользователь переходит к startDestination.
  • В DisabledDestination и drawerState.isOpen:
    Здесь NavHost обрабатывает обратное событие, и пользователь переходит к startDestination.
В обоих случаях, вернувшись к startDestination, NavigationDrawer обрабатывает событие возврата, если оно открыто, else NavHost обрабатывает это путем закрытия приложения.
TLDR: я ожидаю, что приложение закроется, если указано DisabledDestination, но также закроет NavigationDrawer, если открыть перед закрытием приложения (которое встроено и работает, но в неправильном месте), и пользователь никогда не должен видеть startDestination, если когда-либо попадет в DisabledDestination.

Подробнее здесь: https://stackoverflow.com/questions/792 ... se-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»