3

我有一个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,但到处都是那些小虫子让我发疯。

4

0 回答 0