为什么当我运行此代码时我的应用程序崩溃:

val scrollState = rememberLazyListState(0)
var isLastItemVisible by remember { mutableStateOf(false) }

LaunchedEffect(scrollState) {
    while (!isLastItemVisible) {
        val lastVisibleItemIndex = scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
        val totalItemsCount = scrollState.layoutInfo.totalItemsCount
        isLastItemVisible = lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
    }

    onLastItemSeen()
}

当我在循环中的最后一行添加任何延迟时,一切都是正确的. 我在LazyRow中显示项目.

推荐答案

它让ANR不会崩溃,因为你在一个无限循环中,你不能滚动.

您可以使用派生的StateOf来判断最后一项是否显示为

val isLastItemVisible by remember {
    derivedStateOf {
        val lastVisibleItemIndex = scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
        val totalItemsCount = scrollState.layoutInfo.totalItemsCount
        lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
    }
}

LaunchedEffect(isLastItemVisible){
    if (isLastItemVisible){
        // Send event here
    }
}

或快照在启动中流动只发送一次事件的影响

// Sends event only once
LaunchedEffect(scrollState) {
    snapshotFlow {
        scrollState.layoutInfo
    }
        .map {
            val lastVisibleItemIndex = it.visibleItemsInfo.lastOrNull()?.index
            val totalItemsCount = it.totalItemsCount
            lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
        }
        // If it's a one time event filtering it
        .filter { it }
        .distinctUntilChanged()
        .collect {
            println("New Event sent...")
        }
}

或每次最后一项可见时发送事件的

// Sends event every time last item is seen
LaunchedEffect(scrollState) {
    snapshotFlow {
        scrollState.layoutInfo
    }
        .map {
            val lastVisibleItemIndex = it.visibleItemsInfo.lastOrNull()?.index
            val totalItemsCount = it.totalItemsCount
            lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
        }
        .distinctUntilChanged()
        .collect {visible->
            println("Scroll visible: $visible")
            if (visible){
                println("New Event sent...")
            }

        }
}

另外,我还添加了一个示例,当最后一项可见时,可以实现在底部显示按钮,例如

@Preview
@Composable
private fun ListSample() {
    val scrollState = rememberLazyListState(0)

    val isLastItemVisible by remember {
        derivedStateOf {
            val lastVisibleItemIndex = scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
            val totalItemsCount = scrollState.layoutInfo.totalItemsCount
            lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
        }
    }

    Box {
        LazyColumn(
            state = scrollState
        ) {
            items(20) {
                Text(
                    text = "Row $it",
                    modifier = Modifier.fillMaxWidth().padding(8.dp),
                    fontSize = 20.sp
                )
            }
        }

        if (isLastItemVisible) {
            FloatingActionButton(
                modifier = Modifier.align(Alignment.BottomEnd).padding(8.dp),
                onClick = {

                },
                content = {
                    Icon(imageVector = Icons.Default.ArrowUpward, contentDescription = null)

                }
            )
        }
    }
}

Android相关问答推荐

将动作传递给嵌套的可组合物

编写Landscape BoxWithRequests具有错误的高度.(aspectRatio matchHeight约束第一次未按预期工作)

Android和Rust,OpenSSL交叉编译在ARM V7上链接失败

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

如何将DrawableId参数传递给XML布局?

Android Studio 在 list 文件中已经声明了活动类,但仍出现无法找到明确的活动类的错误

在 AGP 8.0 中构建失败,无法应用插件realm-android. APIandroid.registerTransform已删除

延时kotlin中时分秒的使用方法

如何在 Delphi 和 Android 上避免 Indy Socket Error #13 Access denied 异常?

在 react native 中设置 react-native-paper 组件的样式

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

在 Jetpack Compose 中包装内容

如何只允许拖动 BottomSheetScaffold 中 BottomContent 的 SheetPeek 的一部分?

错误:构建 react-native 应用程序时包 com.facebook.react.bridge 不存在

在jetpack compose中将图像添加到脚手架顶部栏

运行一次 kotlin 流,但在下游收到两次

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

如何使用 Jetpack Compose 在应用程序中实现本地化

如何让用户与任意应用程序共享文件?

如何满足设备内框架的无效 Wear OS 屏幕截图Wear OS 表盘策略违规?