gpt4 book ai didi

android - 如何优化 JetPack Compose 列表性能?

转载 作者:行者123 更新时间:2023-12-04 23:53:51 26 4
gpt4 key购买 nike

我有一个包含 LazyColumn 的简单可组合函数:

@Composable
fun MyScreen(itemList: List<Item>) {
LazyColumn {
intems(itemList) {
...
}
}
}

一切都很好,但是当滚动到达某个位置索引时,我的 ViewState(itemList) 应该会改变。这就是为什么我将以下行添加到我的可组合函数中:

@Composable
fun MyScreen(itemList: List<Item>) {
val lazyListState = rememberLazyListState()
viewModel.onPositionChanged(lazyListState.firstVisibleItemIndex)
LazyColumn(state = lazyListState) {
intems(itemList) {
...
}
}
}

一切正常,但性能明显下降。我该如何解决?

最佳答案

这里有两个问题:

  1. 您正在使用 lazyListState.firstVisibleItemIndex 直接在 Composable 中读取状态,这会导致继续重新组合 - 每次 lazyListState 的任何部分发生更改时,例如在每个滚动像素上。
  2. 您正在直接从可组合调用 viewModel.onPositionChanged。建议使用特殊的副作用函数进行此类调用,在 thinking in compose 中阅读有关该主题的更多信息。和副作用documentation .

在这种情况下,LaunchedEffectsnapshotFlow 可以像这样使用:

LaunchedEffect(Unit) {
snapshotFlow { lazyListState.firstVisibleItemIndex }
.collect(viewModel::onPositionChanged)
}

当您需要根据列表状态更新 View 时,您也可能会遇到同样的问题。在这种情况下 derivedStateOf应该使用:只有在计算值实际发生变化时才会导致重新组合。

val firstVisibleItemIndex by remember {
derivedStateOf {
lazyListState.firstVisibleItemIndex
}
}

关于android - 如何优化 JetPack Compose 列表性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71807439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com