【问题标题】:Items recompose during scrolling list项目在滚动列表期间重组
【发布时间】:2022-11-26 23:16:45
【问题描述】:

在我的屏幕上,我有 MyTopItem() 和下面的项目列表。 当我开始滚动列表时,我想隐藏MyTopItem()

它工作正常,但滚动太慢了。 发生这种情况是因为在滚动MyLazyVerticalGridItemsSection() 中的所有项目时重新组合。

如何避免在滚动过程中重新组合?

Column(Modifier.fillMaxSize()) {
    val listState = rememberLazyListState()

    AnimatedVisibility(
        visible = listState.firstVisibleItemScrollOffset < 1,
        enter = expandVertically(),
        exit = shrinkVertically()
    ) {
        MyTopItem()
    }
    MyLazyVerticalGridItemsSection(
        items = myItems,
        listState = listState
    )
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose compose-recomposition


    【解决方案1】:

    发生这种情况是因为您直接使用 listState.firstVisibleItemScrollOffset,因此每次此值更改时,都会触发重组。

    在这种情况下,应使用derivedStateOf——它只会在计算结果发生变化时触发重组::

    val visible by derivedStateOf { listState.firstVisibleItemScrollOffset < 1 }
    

    【讨论】:

    • 滚动不那么滞后,但仍然不流畅。我已经添加到每个列表项目编号 = (0..100).random() 并且当我滚动时每个项目中的数字都在变化所以我猜重组仍然在滚动期间发生(?)它很好还是有更好的解决方案处理那个案子?
    • @Wafi_ck 还有很多其他原因会导致它滞后,例如它可能在调试模式下滞后,请尝试运行发布版本。但可以肯定的是,它不应该在滚动期间重新组合——只有新出现的项目才应该组合;没有minimal reproducible example就很难说
    • 是的,我已经在另一个屏幕上检查过了,你的解决方案按预期工作。谢谢!
    • 我必须声明 listState 并在我的屏幕顶部可见。
    猜你喜欢
    • 2017-04-08
    • 2015-11-10
    • 1970-01-01
    • 2012-03-25
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多