Кнопка «Назад» находится в верхней панели, которую я считаю общей.
Я создаю приложение для Android с помощью Jetpack Compose, где у меня есть пейджер с горизонтальным просмотром (HorizontalPager) с 4 основными экранами и индикатором пейджера, показывающим текущее положение пользователя. Каждый главный экран имеет собственный набор подэкранов, структурированных следующим образом:
- Первый экран: 0 подэкранов
< li>Второй экран: 4 подэкрана - Третий экран: 2 подэкрана
- Четвертый экран: 0 подэкранов
- Обработка обратной навигации - У меня есть кнопка «Назад» в верхней панели (общая для всех экранов), которая должна обрабатывать навигацию двумя способами:
[*]Если пользователь находится на подэкране (например, подэкране 3 на втором экране), нажатие кнопки «Назад» должно вернуть его на первый подэкран главного экрана (например, на первый подэкран второго экрана).
[*]Если они уже находятся на первом подэкране главного экрана, нажатие кнопки «Назад» должно переместить их на предыдущий главный экран пейджера.
[*]Индикатор пейджера[/b] – индикатор пейджера должен точно отражать текущий главный экран.
< /ol>
Я ищу лучший подход для обработки этого типа вложенной навигации в Jetpack Compose, в частности для управления обратными стопками на каждом главном экране и обеспечения плавных переходов между подэкранами и основными экранами в пейджер просмотра.
@Composable
fun AddDeviceFlow() {
Scaffold(modifier = Modifier
.fillMaxSize()
.statusBarsPadding(),
topBar = {
AddDeviceAppBar(modifier = Modifier,
showCloseButton = true,
showBackButton = false,
onClickBackButton = {
// handle viewpager screens and nested screens pop back navigation
},
onClickCloseButton = {})
}
) { innerPadding ->
Surface(modifier = Modifier.padding(innerPadding)) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
HorizontalPagerWithGradientIndicators()
}
}
}
}
@Composable
fun HorizontalPagerWithGradientIndicators() {
val pagerState = rememberPagerState(pageCount = { 4 })
val isLastPage = pagerState.currentPage == pagerState.pageCount - 1
val coroutineScope = rememberCoroutineScope()
val constraintSet = ConstraintSet {
val (
pager,
pagerIndicator
) = createRefsFor(
"pager",
"pagerIndicator"
)
constrain(pagerIndicator) {
top.linkTo(parent.top)
bottom.linkTo(pager.top)
centerHorizontallyTo(parent)
}
constrain(pager) {
top.linkTo(pagerIndicator.bottom)
bottom.linkTo(parent.bottom)
centerHorizontallyTo(parent)
}
}
ConstraintLayout(
constraintSet = constraintSet,
modifier = Modifier
) {
// here is stepper code I removed for brevity
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxWidth()
.layoutId("pager"),
) {
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ted-sub-sc