我有一个HorizontalPager
( com.google.accompanist:accompanist-pager:0.20.0
) 有两页,每一页都包含一个项目列表。每个项目都有一个在第一次合成时触发的进入动画。在编写寻呼机时,两个页面也是同时编写的,但奇怪的是,并非总是如此。
由于其他原因,我存储PagerState
在我的视图模型中,因此保留了最后一个活动选项卡。如果是第一页,则两个页面同时组合,导致帧时间图出现峰值。但是,如果它是第二页,则只有它与其列表组成,并且第一页在我朝其方向滚动的那一刻被填充。这很方便!
为了更好地理解,这里有一些伪代码。
@Composable
fun PagerScreen(viewModel: SomeViewModel) {
val firstList by viewModel.firstListFlow.collectAsState()
val secondList by viewModel.secondListFlow.collectAsState()
HorizontalPager(
state = viewModel.pagerState
/* ... */
) { index ->
// "Switch-case"ing tabs by index and displaying a LazyColumn for each.
}
}
如果我导航到此屏幕,滚动到第二个选项卡,然后导航到别处并再次返回,则第二个选项卡将在没有性能问题的情况下组合,而第一个选项卡将在我开始滚动到它之前不会组合,即懒惰。它实际上看起来像一个错误,但在我的情况下我想要这种行为。
所以问题是我们如何强制寻呼机的页面懒惰地组成呢?
如果我们收集它可能是可能的PagerState.targetPage
,但它需要非平凡的逻辑,我想避免它,因为这种行为已经存在。
更新 - 一些迷幻的东西
该问题可以通过添加任意数量的itemSpacing
.
HorizontalPager(
state = viewModel.pagerState,
itemSpacing = 1.dp,
/* ... */
) { index ->
// "Switch-case"ing tabs by index and displaying a LazyColumn for each.
}
如何?为什么?我们永远不会知道。但是这样做会在同级库中引入另一个奇怪的问题,指标行为不正确,正如我在这个 gifcom.google.accompanist:accompanist-pager-indicators:0.20.0
上演示的那样。再次,注意指标。
尽管我很喜欢 Compose,但到处都是那些小虫子让我发疯。