Estou tentando interceptar e consumir todos os eventos de clique no nível pai no Jetpack Compose para que os composables filhos (como um Button) não recebam cliques. No entanto, mesmo depois de chamar consuma() em awaitPointerEventScope, o filho ainda recebe o evento de clique.
Aqui está meu código:
@Composable
fun ParentConsumesClick() {
Box(
modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val event = awaitPointerEvent()
Log.d("Click", "Consumed in Parent")
event.changes.forEach { it.consume() } // Consume touch event
}
}
}
.background(Color.Gray),
contentAlignment = Alignment.Center
) {
Button(onClick = { Log.d("Click", "Child clicked") }) {
Text("Click Me")
}
}
}
Comportamento esperado:
- Clicar em qualquer lugar dentro da caixa deve registrar
"Consumed in Parent"
. - O botão interno não deve receber nenhum clique (ou seja,
"Child clicked"
não deve ser registrado).
Comportamento real:
"Consumed in Parent"
é registrado (mostrando que o pai recebe o evento).- Mas o Botão ainda recebe o evento de clique e registra
"Child clicked"
.
Você precisa consumir o evento inativo para que o Modificador ou Botão clicável não receba eventos de clique.
Além disso, como os gestos se propagam do filho para o pai, você precisa alterar o passe de Principal para Inicial para que o pai receba o toque primeiro.
Você pode conferir esta resposta para mais detalhes sobre como o sistema de gestos funciona no Jetpack Compose.
Crie um modificador como
E aplique este modificador ao pai, como
Além disso, se você quiser aplicar ondulação neste clique, você pode adicionar InteractionSouce e Modifier.indication.