Код: Выделить всё
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 для каждого верхнего уровня, чтобы избежать нижней панели на экране настроек (даже если настройки не являются частью нижней панели).
ПРИМЕЧАНИЕ. В навигации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
)
}
}
}
Код: Выделить всё
sealed interface BottomBar
sealed interface MainRoute : NavKey {
@Serializable
data object Home : MainRoute, BottomBar
@Serializable
data object Profile : MainRoute, BottomBar
@Serializable
data object Settings : MainRoute
}
Код: Выделить всё
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
Мобильная версия