Экраны обеих вкладок идентичны, в качестве пользовательского интерфейса используется Jetpack Compose.
Данные извлекается с помощью библиотеки Paging 3 из общей конечной точки API, отличающейся параметром запроса для возврата списка видео или журналов.
Однако при переключении между вкладками состояние не сохраняется — и состояние прокрутки, и данные подкачки теряются и начинаются с позиции 0 в списке.
Как сохранить состояние (включая положение прокрутки и данные подкачки) при переключении вкладок в Jetpack Compose?
Код: Выделить всё
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun MainScreen(
modifier: Modifier = Modifier,
categoryData: CategoryData?
) {
if (categoryData == null) {
return
}
val items = categoryData.categories
val pagerState = rememberPagerState(pageCount = { items.size })
var selectedTabIndex by rememberSaveable { mutableIntStateOf(0) }
LaunchedEffect(key1 = selectedTabIndex) {
pagerState.scrollToPage(selectedTabIndex)
}
Box(
Modifier.fillMaxSize()
) {
HorizontalPager(
state = pagerState,
userScrollEnabled = false
) { page ->
FeedScreen(selectedTabIndex, categoryData.categories[selectedTabIndex].id) {}
}
Box {
LazyRow(
modifier = Modifier
.fillMaxWidth()
.scrollable(
state = rememberScrollState(),
orientation = Orientation.Horizontal
),
verticalAlignment = Alignment.CenterVertically
) {
itemsIndexed(items) { index, currentTab ->
CustomTab(currentTab.name, selectedTabIndex == index, index) { pos ->
selectedTabIndex = pos
}
}
}
}
}
}`
Код: Выделить всё
@OptIn(
ExperimentalFoundationApi::class, ExperimentalPermissionsApi::class
)
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
@Composable
fun FeedScreen(
selectedTabIndex: Int,
tabId: Int
) {
val viewModel: MainScreenViewModel = viewModel()
viewModel.requestedTabId = tabId
val feedItems = viewModel.feedItems.collectAsLazyPagingItems()
val pagerState = rememberPagerState(pageCount = { feedItems.itemCount })
VerticalPager(
state = pagerState,
modifier = Modifier
.fillMaxSize()
.background(LokalTheme.colors.baseBlack)
.clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() }) {
}
.zIndex(0f),
beyondBoundsPageCount = 3,
) { page ->
val item = feedItems[page]
when (item) {
is PostData.VideoData -> {
//Display VideoCard
}
is PostData.MagazineCardData -> {
//Display MagazineCard
}
}
}
}
Я ожидаю, что вкладки сохранят свое положение прокрутки и данные, когда мы переключаемся между ними.
Подробнее здесь: https://stackoverflow.com/questions/787 ... tpack-comp