本文介绍了如何在Jetpack Compose中禁用和启用LazyColumn/LazyRow中的滚动?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要在LazyColumn中以编程方式动态启用和禁用滚动。

LazyListState上似乎没有任何相关函数,LazyColumn本身似乎也没有相关参数。如何在Compose中实现这一点?

推荐答案

(当前)没有内置方法来执行此操作,这是一个合理的功能请求。

但是scroll接口非常灵活,我们可以自己添加。基本上,我们在MutatePriority.PreventUserInput处创建一个永不结束的伪滚动以防止滚动,然后使用相同优先级的不做任何事情的滚动取消第一个滚动并重新启用滚动。

以下是LazyListState上禁用/重新启用滚动的两个实用函数,以及它们的实际应用演示(需要一些导入,但Android Studio应该会为您推荐它们)。

请注意,因为我们要控制滚动来完成此操作,所以调用reenableScrolling也会取消任何正在进行的滚动或翻转(即,您应该仅在禁用滚动并且您想要重新启用它时才调用它,而不仅仅是确认它已启用)。

fun LazyListState.disableScrolling(scope: CoroutineScope) {
    scope.launch {
        scroll(scrollPriority = MutatePriority.PreventUserInput) {
            // Await indefinitely, blocking scrolls
            awaitCancellation()
        }
    }
}

fun LazyListState.reenableScrolling(scope: CoroutineScope) {
    scope.launch {
        scroll(scrollPriority = MutatePriority.PreventUserInput) {
            // Do nothing, just cancel the previous indefinite "scroll"
        }
    }
}

@Composable
fun StopScrollDemo() {
    val scope = rememberCoroutineScope()
    val state = rememberLazyListState()
    Column {
        Row {
            Button(onClick = { state.disableScrolling(scope) }) { Text("Disable") }
            Button(onClick = { state.reenableScrolling(scope) }) { Text("Re-enable") }
        }
        LazyColumn(Modifier.fillMaxWidth(), state = state) {
            items((1..100).toList()) {
                Text("$it", fontSize = 24.sp)
            }
        }
    }
}

这篇关于如何在Jetpack Compose中禁用和启用LazyColumn/LazyRow中的滚动?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 18:47