它让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)
}
)
}
}
}