Я столкнулся с проблемой при использовании навигации в Compose и хотел бы узнать логику, стоящую за ней. Чтобы достичь следующего UI
У меня есть пользовательский класс
sealed class MyDestination {
@Serializable
object HomeGraph : MyDestination()
@Serializable
object HomeA : MyDestination()
@Serializable
object HomeB : MyDestination()
@Serializable
object RegisterGraph : MyDestination()
@Serializable
object Register1 : MyDestination()
@Serializable
object Register2 : MyDestination()
}
< /code>
и следующие каркасы в MainActivity < /p>
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
MyNavBar(
switchToHomeA = {
navController.navigate(MyDestination.HomeA) {
// Pop current HomeA so User won't back to HomeA
popUpTo(
navController.currentDestination?.route ?: return@navigate
) {
inclusive = true
}
}
},
switchToHomeB = {
navController.navigate(MyDestination.HomeB) {
popUpTo(
// Pop current HomeB so User won't back to HomeB
navController.currentDestination?.route ?: return@navigate
) {
inclusive = true
}
// This will work when User enter register from HomeA, but not HomeB
launchSingleTop = true
}
}
)
},
floatingActionButton = {
MyFab(
toRegister = {
navController.navigate(MyDestination.RegisterGraph)
}
)
}
) { innerPadding ->
NavHost(
modifier = Modifier.padding(innerPadding),
navController = navController,
startDestination = MyDestination.HomeGraph
) {
navigation(
startDestination = MyDestination.HomeA
) {
composable {
Text("HomeA")
}
composable {
Text("HomeB")
}
}
navigation(
startDestination = MyDestination.Register1
) {
composable {
Button(onClick = {
navController.navigate(MyDestination.Register2)
}) {
Text("Next")
}
}
composable {
Button(onClick = {
navController.navigate(MyDestination.HomeGraph) {
// Pop all destinations from RegisterGraph
popUpTo(MyDestination.RegisterGraph) {
inclusive = true
}
}
}) {
Text("Done")
}
}
}
}
}
< /code>
Добавление следующего, чтобы я мог проверить текущий стек < /p>
LaunchedEffect(navController) {
navController.currentBackStack.collect { backStackEntries ->
Log.d(
"Stack",
"Current Stack: ${
backStackEntries.map {
it.destination.route?.substringAfterLast(".")
}
}"
)
}
}
< /code>
Пользователь должен иметь возможность переключаться между Homea и Homeb, и этот переключатель теперь должен быть сложен, короче говоря, пользователь всегда «1» возвращается от закрытия приложения, когда они дома. Вот журнал от нормального взаимодействия.
(приложение открыто)
[null, homegraph, homea]
(chlice пользователя b) Homeb]
(пользователь нажимает кнопку «Плавающее действие», «Заходит в регистр»)
[null, Homegraph, Homeb, registergraph, register1]
(gute nte home)
(Щелкни «Готово») до
Original, но здесь больше, когда пользователь входит в регистр поток на Homea (который является стартовым домохозяйством). После нажатия, выполненного в Register2, журнал будет
[null, homegraph, homea]
, что именно то, что я ожидаю. Я думаю, что это связано с запуском, и True, а Android - это Homea, а не Homegraph в стеке. Теперь, если вы прокомментируете запуск singsingletop = true, даже введите поток регистра из Homea, будут результатами
[null, homegraph, homea, homegraph, homea]
существует правильный, или Google рекомендует решить эту проблему? Или я что -то упускаю, извините
, если его трудно читать, я попробовал ... любой совет будет оценен! < /P>
Подробнее здесь: https://stackoverflow.com/questions/794 ... o-behavior
Android Compose NavController и поведение всплывающего графика ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1741669907
Anonymous
Я столкнулся с проблемой при использовании навигации в Compose и хотел бы узнать логику, стоящую за ней. Чтобы достичь следующего UI
У меня есть пользовательский класс
sealed class MyDestination {
@Serializable
object HomeGraph : MyDestination()
@Serializable
object HomeA : MyDestination()
@Serializable
object HomeB : MyDestination()
@Serializable
object RegisterGraph : MyDestination()
@Serializable
object Register1 : MyDestination()
@Serializable
object Register2 : MyDestination()
}
< /code>
и следующие каркасы в MainActivity < /p>
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
MyNavBar(
switchToHomeA = {
navController.navigate(MyDestination.HomeA) {
// Pop current HomeA so User won't back to HomeA
popUpTo(
navController.currentDestination?.route ?: return@navigate
) {
inclusive = true
}
}
},
switchToHomeB = {
navController.navigate(MyDestination.HomeB) {
popUpTo(
// Pop current HomeB so User won't back to HomeB
navController.currentDestination?.route ?: return@navigate
) {
inclusive = true
}
// This will work when User enter register from HomeA, but not HomeB
launchSingleTop = true
}
}
)
},
floatingActionButton = {
MyFab(
toRegister = {
navController.navigate(MyDestination.RegisterGraph)
}
)
}
) { innerPadding ->
NavHost(
modifier = Modifier.padding(innerPadding),
navController = navController,
startDestination = MyDestination.HomeGraph
) {
navigation(
startDestination = MyDestination.HomeA
) {
composable {
Text("HomeA")
}
composable {
Text("HomeB")
}
}
navigation(
startDestination = MyDestination.Register1
) {
composable {
Button(onClick = {
navController.navigate(MyDestination.Register2)
}) {
Text("Next")
}
}
composable {
Button(onClick = {
navController.navigate(MyDestination.HomeGraph) {
// Pop all destinations from RegisterGraph
popUpTo(MyDestination.RegisterGraph) {
inclusive = true
}
}
}) {
Text("Done")
}
}
}
}
}
< /code>
Добавление следующего, чтобы я мог проверить текущий стек < /p>
LaunchedEffect(navController) {
navController.currentBackStack.collect { backStackEntries ->
Log.d(
"Stack",
"Current Stack: ${
backStackEntries.map {
it.destination.route?.substringAfterLast(".")
}
}"
)
}
}
< /code>
Пользователь должен иметь возможность переключаться между Homea и Homeb, и этот переключатель теперь должен быть сложен, короче говоря, пользователь всегда «1» возвращается от закрытия приложения, когда они дома. Вот журнал от нормального взаимодействия.
(приложение открыто)
[b] [null, homegraph, homea] [/b]
(chlice пользователя b) Homeb]
(пользователь нажимает кнопку «Плавающее действие», «Заходит в регистр»)
[b] [null, Homegraph, Homeb, registergraph, register1] [/b]
(gute nte home)
(Щелкни «Готово») до
Original, но здесь больше, когда пользователь входит в регистр поток на Homea (который является стартовым домохозяйством). После нажатия, выполненного в Register2, журнал будет
[b] [null, homegraph, homea] [/b]
, что именно то, что я ожидаю. Я думаю, что это связано с запуском, и True, а Android - это Homea, а не Homegraph в стеке. Теперь, если вы прокомментируете запуск singsingletop = true, даже введите поток регистра из Homea, будут результатами
[b] [null, homegraph, homea, homegraph, homea] [/b]
существует правильный, или Google рекомендует решить эту проблему? Или я что -то упускаю, извините
, если его трудно читать, я попробовал ... любой совет будет оценен! < /P>
Подробнее здесь: [url]https://stackoverflow.com/questions/79499708/android-compose-navcontroller-and-graph-popupto-behavior[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия