jes*_*nte 13 android android-jetpack-compose android-jetpack-compose-list
我需要检查某个LazyColumn项目何时进入视图,一旦进入,仅回调onItemWithKeyViewed()一次以通知该项目已被查看。我的尝试:
@Composable
fun SpecialList(
someItems: List<Things>,
onItemWithKeyViewed: () -> Unit
) {
val lazyListState = rememberLazyListState()
if (lazyListState.isScrollInProgress) {
val isItemWithKeyInView = lazyListState.layoutInfo
.visibleItemsInfo
.any { it.key == "specialKey" }
if (isItemWithKeyInView) {
onItemWithKeyViewed()
}
}
LazyColumn(
state = lazyListState
) {
items(items = someItems) { itemData ->
ComposableOfItem(itemData)
}
item(key = "specialKey") {
SomeOtherComposable()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的方法的问题是我注意到列表滚动性能严重下降并丢失帧。我意识到这可能是因为它正在检查每一帧上的所有可见项目键?
此外,onItemWithKeyViewed()当前已被多次调用,而不仅仅是第一次查看。
是否有更有效的方法来仅对onItemWithKeyViewed()第一次"specialKey"查看项目进行一次回调?
Phi*_*hov 15
derivedStateOf:这只会在计算结果实际发生变化时才导致重组。onItemWithKeyViewed您不应直接在可组合构建器中调用副作用(正在调用)。通常,您应该使用一种特殊的副作用函数LaunchedEffect- 这可以确保该操作不会重复。您可以在Thinking in Compose和副作用文档中找到有关此主题的更多信息。val isItemWithKeyInView by remember {
derivedStateOf {
lazyListState.isScrollInProgress &&
lazyListState.layoutInfo
.visibleItemsInfo
.any { it.key == "specialKey" }
}
}
if (isItemWithKeyInView) {
LaunchedEffect(Unit) {
onItemWithKeyViewed()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6326 次 |
| 最近记录: |