Как захватить нажатие и жест кнопки «Назад» до того, как это сделает навигационный хостAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как захватить нажатие и жест кнопки «Назад» до того, как это сделает навигационный хост

Сообщение Anonymous »

Для Android-приложения Jetpack Compose, которому требуется переход по нескольким страницам, я объединяю ModalNavigationDrawer с NavigationHost.
Я' Я новичок в Jetpack Compose, так что, возможно, это не лучший вариант.
Кликабельный значок гамбургера, помещенный в TopAppBar, позволяет открыть а ModalNavigationDrawer при нажатии.
Я использую составной BackHandler для получения нажатий кнопок «Назад», см. код ниже, поэтому я могу закрыть ящик, если он открыт . Это то, чего я хочу достичь.
Он работает нормально, лямбда в BackHandler вызывается, когда обратный стек навигатора пуст, но обратная навигация для NavigationHost вызывается, когда его стек не пуст.
Как я могу захватить и обработать нажатия кнопки «Назад» до того, как NavigationHost обработает их?
Это упрощенный код для onCreate:

Код: Выделить всё

override fun onCreate(savedInstanceState: Bundle?) {
/* etc. */
setContent {
/* viewModel, etc. */
AppTheme {
Scaffold { paddingValues ->
MainActivityScreen(
viewModel = viewModel,
modifier = Modifier.padding(paddingValues = paddingValues)
)
}
}
}
}
И MainActivityScreen Compose выглядит так:

Код: Выделить всё

@Composable
fun MainActivityScreen(
viewModel: HomeScreenViewModel,
modifier: Modifier = Modifier
) {
val navHostController = rememberNavController()
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(
state = rememberTopAppBarState()
)
BackHandler(enabled = viewModel.isDrawerOpen) {
viewModel.onHomeScreenAction(action = HomeScreenAction.CloseDrawer)
}
ModalNavigationDrawer(
drawerState = viewModel.drawerState,
drawerContent = {
ModalDrawerSheet {
LazyColumn {
// drawerHeader() composes a header for the drawer
drawerHeader()
items(Screen.screens) { screen ->
val selected = navHostController.currentBackStackEntry?.destination?.route == screen.route
DrawerScreenItem(
screen = screen,
selected = selected,
) {
// `viewModel.onHomeScreenAction`, eventually, emits target routes using `viewModel.navigationTargetFlow`.
viewModel.onHomeScreenAction(HomeScreenAction.SelectScreen(screen = screen))
}
}
}
}
}
) {
Scaffold(
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = /* ..top bar.. */
) { innerPadding ->
NavigationHost(
navHostController = navHostController,
innerPadding = innerPadding
)
LaunchedEffect("navigation") {
// viewModel.navigationTargetFlow returns a flow of `data class Screen(val target: String) ...etc...`,
viewModel.navigationTargetFlow.onEach {
navHostController.navigate(it.target)
}.launchIn(this)
}
}
}
}
BR


Подробнее здесь: https://stackoverflow.com/questions/793 ... nhost-does
Ответить

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

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

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

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

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