Я' Я новичок в 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)
)
}
}
}
}
Код: Выделить всё
@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)
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... nhost-does
Мобильная версия