Как обрабатывать навигацию в Navigation3Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как обрабатывать навигацию в Navigation3

Сообщение Anonymous »

Я пишу этот пост, потому что пытаюсь создать приложение со следующей навигацией:

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

GlobalNavigation
│
├── AuthActivity (without bottombar)
│   ├── LoginScreen
│   ├── RecoveryScreen
│   ├── SignUpScreen
│
└── MainActivity
│
├── HomeNavTopLevel Graph (Home, Chat, Settings…) → with BottomBar
│   ├ Home
│   ├ Profile
│
└── SettingsNavTopLevel Graph (Setting or more screens) → without BottomBar
├ One or more screens
Мой вопрос следующий:
  • Как избежать изменения размера экрана настроек при переходе к нему из экрана нижней панели?
  • Мне нужно создать NavDisplay для каждого верхнего уровня, чтобы избежать нижней панели на экране настроек (даже если настройки не являются частью нижней панели).
Моя текущая реализация — это один NavDisplay внутри Scaffold, содержащий навигацию MainActivity, как в примере выше, скрывающий нижний бар, когда topLevelStack не является интерфейсом BottomBar, но если вы используете gif внизу, вы увидите, что когда я перехожу к настройкам, нижняя панель скрыта, но экран настроек (желтый) на мгновение имеет ту же высоту, что и экраны нижней панели, и через несколько миллисекунд (или секунд) он расширяется по экрану (потому что нижняя панель была скрыта).
ПРИМЕЧАНИЕ. В навигации2 я создал navController для каждой дополнительной навигации, например, auth и main имеют NavHostController, но внутри него создайте поднавигацию с навигацией, и только для дома я создал еще один NavHostController для управления навигацией BottomBar.
Содержимое MainActivity (Composables):

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

@Composable
fun MainContent(
openAuthActivity: () -> Unit,
navigator: MainNavigator
) {
SerenoTheme(
dynamicColor = false
) {
Scaffold(
modifier = Modifier
.fillMaxSize(),
bottomBar = {
AnimatedVisibility(
navigator.topLevelKey is BottomBar,
enter = fadeIn(),
exit = fadeOut()
) {
NavigationBar(

) {
HomeBottomBarItems.HOME_LEVEL_ROUTES.forEach { (key, item) ->
val isSelected = key == navigator.topLevelKey

NavigationBarItem(
selected = isSelected,
onClick = {
navigator.switchTopLevel(key)
},
icon = {
Icon(
imageVector = item.icon,
contentDescription = null,
)
},
label = {
Text(
text = stringResource(item.labelStringRes)
)
}
)
}
}
}
}
) { innerPadding ->
val modifier = remember {
Modifier.padding(innerPadding)
}

MainDisplay(
modifier = modifier,
navigator = navigator,
openAuthActivity = openAuthActivity
)
}
}
}
Запечатанный интерфейс Mi для пунктов назначения:

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

sealed interface BottomBar

sealed interface MainRoute : NavKey {
@Serializable
data object Home : MainRoute, BottomBar

@Serializable
data object Profile : MainRoute, BottomBar

@Serializable
data object Settings : MainRoute
}
AppNavigator для поддержки нескольких обратных стеков:

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

class AppNavigator(private val startKey: T) {

private var topLevelBackStacks: HashMap = hashMapOf(
startKey to mutableStateListOf(startKey)
)

var topLevelKey by mutableStateOf(startKey)
private set

val backStack = mutableStateListOf(startKey)

private fun updateBackStack() {
backStack.clear()
val currentStack = topLevelBackStacks[topLevelKey] ?: emptyList()

if (topLevelKey == startKey) {
backStack.addAll(currentStack)
} else {
val startStack = topLevelBackStacks[startKey] ?: emptyList()
backStack.addAll(startStack + currentStack)
}
}

fun switchTopLevel(key: T) {
if (topLevelBackStacks[key] == null) {
topLevelBackStacks[key] = mutableStateListOf(key)
}
topLevelKey = key
updateBackStack()
}

fun add(key: T) {
topLevelBackStacks[topLevelKey]?.add(key)
updateBackStack()
}

fun removeLast() {
val currentStack = topLevelBackStacks[topLevelKey] ?: return

if (currentStack.size > 1) {
currentStack.removeLastOrNull()
} else if (topLevelKey != startKey) {
topLevelKey = startKey
}
updateBackStack()
}

fun replaceStack(vararg keys: T) {
topLevelBackStacks[topLevelKey] = mutableStateListOf(*keys)
updateBackStack()
}
}
И видео, показывающее, как работает приложение:

Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... avigation3
Ответить

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

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

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

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

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