Как переместить маршрут на вершину стека в Jetpack Compose NavigationAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как переместить маршрут на вершину стека в Jetpack Compose Navigation

Сообщение Anonymous »

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

@Composable
fun TopLevelNavHost(
navigateToRoot: (Route) -> Unit,
modifier: Modifier = Modifier
) {
val topLevelNavController = rememberNavController()
val currentBackStackEntry by topLevelNavController.currentBackStackEntryAsState()
val currentBackStack by topLevelNavController.currentBackStack.collectAsStateWithLifecycle()
val density = LocalDensity.current

val navigateTo: (Route) -> Unit = { route ->
if (route !is Route.TopLevel) {
navigateToRoot(route)
} else {
topLevelNavController.navigate(route.path)
}
}
Scaffold(
bottomBar = {
BottomBar(
currentRoutePath = currentBackStackEntry?.destination?.route ?: "top_level",
navigateToCallback = { route ->
topLevelNavController.navigate(route.path) {
if (currentBackStack.any { navBackStackEntry -> navBackStackEntry.destination.route == route.path }){
launchSingleTop = true
} else {
restoreState = true
}
}
}
)
},
modifier = modifier,
) { innerPadding ->
NavHost(
navController = topLevelNavController,
startDestination = Route.TopLevel.Home.path,
modifier = modifier.padding(
bottom = innerPadding.calculateBottomPadding() - with(density) {
ScaffoldDefaults.contentWindowInsets.getBottom(density).toDp()
},
),
) {
// composables
}
}
}

@Composable
fun BottomBar(
currentRoutePath: String,
navigateToCallback: (Route) -> Unit,
modifier: Modifier = Modifier
) {
NavigationBar(
modifier = modifier,
) {
TOP_LEVEL_ROUTES.forEach { entry ->
val isSelected = entry.path == currentRoutePath
NavigationBarItem(
selected = isSelected,
onClick = { navigateToCallback(entry) },
icon = {
Icon(
imageVector = (if (isSelected) entry.selectedIcon else entry.icon)
?: Icons.Default.Error,
contentDescription = entry.name,
modifier = Modifier.semantics { role = Role.Tab },
)
},
)
}
}
}
Вышеупомянутый TopLevelNavHost является вложенным из RootNavHost, и я пытаюсь добиться того, чтобы при навигации через нижнюю панель навигации, если пользователь переходит к пункту назначения, уже присутствующему на графике, просто переместите этот пункт назначения на вершину стека.
Я нашел предложение использовать popUpTo, но это удаляет промежуточные маршруты, чего я не хочу. По сути, пытаюсь реализовать навигацию YouTube.


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

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

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

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

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

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