Я работаю над приложением для Android, используя Jetpack Compose и Compose Destinations для навигации. В моем приложении есть ModalNavigationDrawer. Модальное окно открывается и закрывается с помощью жестов, но когда модальное окно открыто, я бы хотел, чтобы его можно было закрыть с помощью кнопки «Назад». Это кажется естественным действием и работает практически в любом другом приложении, которое я использовал.
Вместо этого кнопка «Назад» просто закрывает (сворачивает) приложение или переходит к предыдущему экрану. Я предполагаю, что это происходит потому, что Compose Destinations перехватывает обратное действие и извлекает его из стека. Однако в документации на первый взгляд ничего не упоминается о решении этой проблемы. Здесь упоминаются единственные ящики времени, но это не имеет отношения к рассматриваемой проблеме.
Я нашел несколько сообщений на SO о том, как перехватить обратное нажатие, но они кажутся мне немного хакерскими. Это похоже на базовый вариант использования, который должен иметь простое и достойное решение. Поэтому я пришел спросить, есть ли рекомендуемый способ решения этой проблемы.
Основное приложение выглядит так:
@Composable
fun App() {
val navEngine = rememberNavHostEngine()
val navController = navEngine.rememberNavController()
val startRoute = HomeRouteDestination
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
DestinationsNavHost(
engine = navEngine,
navController = navController,
navGraph = NavGraphs.root,
startRoute = startRoute
)
}
}
Мой компонент ящика:
private data class DrawerItem(
val icon: ImageVector,
val name: String,
val destination: DirectionDestination
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NavDrawerWrapper(
navigator: DestinationsNavigator = EmptyDestinationsNavigator,
content: @Composable (() -> Unit, () -> Unit) -> Unit
) {
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
val openDrawer: () -> Unit = { scope.launch { drawerState.open() } }
val closeDrawer: () -> Unit = { scope.launch { drawerState.close() } }
val items = listOf(
DrawerItem(Icons.Default.List, "Menu", HomeRouteDestination),
DrawerItem(Icons.Default.Settings, "Settings", SettingsRouteDestination)
)
var selectedItem by remember { mutableStateOf(items[0]) }
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
DrawerSheet(
items, selectedItem,
onSelectItem = { item ->
closeDrawer()
selectedItem = item
navigator.navigate(item.destination)
}
)
},
content = { content(openDrawer, closeDrawer) }
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DrawerSheet(
items: List = listOf(),
selectedItem: DrawerItem? = null,
onSelectItem: (DrawerItem) -> Unit = {}
) {
ModalDrawerSheet {
LazyColumn(modifier = Modifier.padding(horizontal = 15.dp, vertical = 20.dp)) {
items(items.size) { index ->
val item = items[index]
NavigationDrawerItem(
label = { Text(text = item.name) },
icon = { Icon(imageVector = item.icon, contentDescription = item.name) },
selected = item == selectedItem,
onClick = { onSelectItem(item) }
)
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/765 ... -of-closin
Нажатие кнопки «Назад» на ModalNavigationDrawer позволяет вернуться назад, а не закрывать ящик. ⇐ Android
Форум для тех, кто программирует под Android
1760767372
Anonymous
Я работаю над приложением для Android, используя Jetpack Compose и Compose Destinations для навигации. В моем приложении есть ModalNavigationDrawer. Модальное окно открывается и закрывается с помощью жестов, но когда модальное окно открыто, я бы хотел, чтобы его можно было закрыть с помощью кнопки «Назад». Это кажется естественным действием и работает практически в любом другом приложении, которое я использовал.
Вместо этого кнопка «Назад» просто закрывает (сворачивает) приложение или переходит к предыдущему экрану. Я предполагаю, что это происходит потому, что Compose Destinations перехватывает обратное действие и извлекает его из стека. Однако в документации на первый взгляд ничего не упоминается о решении этой проблемы. Здесь упоминаются единственные ящики времени, но это не имеет отношения к рассматриваемой проблеме.
Я нашел несколько сообщений на SO о том, как перехватить обратное нажатие, но они кажутся мне немного хакерскими. Это похоже на базовый вариант использования, который должен иметь простое и достойное решение. Поэтому я пришел спросить, есть ли рекомендуемый способ решения этой проблемы.
Основное приложение выглядит так:
@Composable
fun App() {
val navEngine = rememberNavHostEngine()
val navController = navEngine.rememberNavController()
val startRoute = HomeRouteDestination
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
DestinationsNavHost(
engine = navEngine,
navController = navController,
navGraph = NavGraphs.root,
startRoute = startRoute
)
}
}
Мой компонент ящика:
private data class DrawerItem(
val icon: ImageVector,
val name: String,
val destination: DirectionDestination
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NavDrawerWrapper(
navigator: DestinationsNavigator = EmptyDestinationsNavigator,
content: @Composable (() -> Unit, () -> Unit) -> Unit
) {
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
val openDrawer: () -> Unit = { scope.launch { drawerState.open() } }
val closeDrawer: () -> Unit = { scope.launch { drawerState.close() } }
val items = listOf(
DrawerItem(Icons.Default.List, "Menu", HomeRouteDestination),
DrawerItem(Icons.Default.Settings, "Settings", SettingsRouteDestination)
)
var selectedItem by remember { mutableStateOf(items[0]) }
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
DrawerSheet(
items, selectedItem,
onSelectItem = { item ->
closeDrawer()
selectedItem = item
navigator.navigate(item.destination)
}
)
},
content = { content(openDrawer, closeDrawer) }
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DrawerSheet(
items: List = listOf(),
selectedItem: DrawerItem? = null,
onSelectItem: (DrawerItem) -> Unit = {}
) {
ModalDrawerSheet {
LazyColumn(modifier = Modifier.padding(horizontal = 15.dp, vertical = 20.dp)) {
items(items.size) { index ->
val item = items[index]
NavigationDrawerItem(
label = { Text(text = item.name) },
icon = { Icon(imageVector = item.icon, contentDescription = item.name) },
selected = item == selectedItem,
onClick = { onSelectItem(item) }
)
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/76564309/pressing-back-button-on-a-modalnavigationdrawer-navigates-back-instead-of-closin[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия