Jetpack Compose:当使用 Modifier.selectable 时,如何防止布局可组合在滚动时被选择?

Edw*_*aak 6 android kotlin android-jetpack-compose

在 Jetpack Compose 中有一个Modifier名为selectable.

将组件配置为可选择的,通常作为互斥组的一部分,在任何时间点只能选择一个项目。

我将它用于可滚动列表内的互斥无线电组。在我的情况下LazyColumn。这工作正常,单击可选区域会点亮它们并导致检测到点击。但是我注意到在滚动时“触摸”这些区域时该区域也会亮起。

如果您想了解我的意思,我制作了一个可组合的简单示例,只需滚动列表,您就会看到滚动如何触发短选择状态:

@Composable
    fun Example() {
        LazyColumn {
            item {
                repeat(100){
                    Column(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(40.dp)
                            .selectable(
                                selected = false,
                                onClick = { }
                            )
                    ) {
                        Text("Example")
                    }
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

有没有人想出如何解决某种行为?我尝试在https://developer.android.com/jetpack/compose/gestures寻找任何相关文档,但没有真正解释如何在滚动时“阻止”触摸事件。

Thr*_*ian 0

您可以根据滚动状态有选择地启用 Modifier.selectable(enabled),但即使derivedStateOf我看到也存在巨大的性能损失。

val scrollState = rememberLazyListState()

val enableSelectable = derivedStateOf {
    !scrollState.isScrollInProgress
}


Modifier
    .fillMaxWidth()
    .height(40.dp)
    .selectable(
        enabled = enableSelectable.value,
        selected = false,
        onClick = { }
    )
Run Code Online (Sandbox Code Playgroud)