Нажатие кнопки «Назад» на ModalNavigationDrawer позволяет вернуться назад, а не закрывать ящик.Android

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

Сообщение 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) }
)
}
}

}
}


Подробнее здесь: https://stackoverflow.com/questions/765 ... -of-closin
Ответить

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

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

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

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

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