gpt4 book ai didi

android - 检查特定 LazyColumn 项目何时出现的有效方法?

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

我需要检查某个 LazyColumn item 出现,一旦出现,就回调 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()
}
}
}
我的方法的问题是我注意到列表滚动性能严重下降并丢失帧。我意识到这可能是因为它正在检查每一帧上的所有可见项目键?
另外, onItemWithKeyViewed()当前被多次调用,而不是第一次被查看。
有没有更有效的方法来对 onItemWithKeyViewed() 进行一次回调?只有第一次 "specialKey"项目被查看?

最佳答案

  • 在这种情况下,当您的状态经常更新时,您应该使用 derivedStateOf :这只会在计算结果实际发生变化时才会导致重新组合。
  • 您不应直接在可组合构建器中调用副作用(调用 onItemWithKeyViewed)。您应该改用其中一种特殊的副作用函数,通常是 LaunchedEffect - 这确保了该 Action 不会重复。您可以在 Thinking in Compose 中找到有关此主题的更多信息。和副作用documentation .

  • val isItemWithKeyInView by remember {
    derivedStateOf {
    lazyListState.isScrollInProgress &&
    lazyListState.layoutInfo
    .visibleItemsInfo
    .any { it.key == "specialKey" }
    }
    }
    if (isItemWithKeyInView) {
    LaunchedEffect(Unit) {
    onItemWithKeyViewed()
    }
    }

    关于android - 检查特定 LazyColumn 项目何时出现的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70951060/

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