Jetpack Compose: как отключить обнаружение жестов у детей

Есть ли встроенный Modifier который отключает любое взаимодействие обнаружения жестов / ввода указателя его дочерних элементов?

например

      @Composable
fun Foo() {
    Box(modifier = Modifier.gesturesEnabled(enabled = false)) {
        BasicText(text = "Hello", modifier = Modifier.clickable { // clickable is not enabled
            // ...
        })
    }
}

Я мог бы свернуть свою (очень простую) реализацию, используя CompositionLocal:

      val LocalGesturesEnabled = compositionLocalOf { mutableStateOf(true) }

fun Modifier.myClickable(onClick: () -> Unit, enabled: Boolean = true) = composed {
    clickable(enabled = enabled && LocalGesturesEnabled.current.value, onClick)
}

Но он не будет работать со сторонними компонентами или с более сложными компонентами, такими как LazyList.

1 ответ

Использование модификатора pointerInput, вы можете получить все события касания с помощью awaitPointerEvent.

С pass = PointerEventPass.Initial вы получите события перед всеми дочерними представлениями, а затем вы можете пометить событие как обработанное с помощью consumeAllChanges, чтобы дети больше не получали их.

      fun Modifier.gesturesEnabled(enabled: Boolean) =
    pointerInput(enabled) { 
        // if gestures enabled, we don't need to interrupt 
        if (enabled) return@pointerInput

        awaitPointerEventScope {
            // we should wait for all new pointer events
            while (true) {
                awaitPointerEvent(pass = PointerEventPass.Initial)
                    .changes
                    .forEach(PointerInputChange::consumeAllChanges)
            }
        }
    }

Если вы хотите узнать больше об обработке пользовательских жестов, ознакомьтесь с этой статьей.

Другие вопросы по тегам