news 2026/5/23 7:31:47

Compose 事件分发:Initial、Main、Final

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Compose 事件分发:Initial、Main、Final

在传统 View 体系中,我们接触最多的就是

dispatchTouchEvent (父节点 → 子节点) └── onInterceptTouchEvent onTouchEvent (子节点 → 父节点)

而在 Compose 中,事件分发不再依赖 ViewGroup 的拦截模型,而是基于Modifier 链 + PointerInput 节点 + 多阶段事件传递

PointerEventPass.Initial (父节点 → 子节点) 父级优先观察或预处理事件 PointerEventPass.Main (子节点 → 父节点) 子组件优先处理事件,最常用 PointerEventPass.Final (父节点 → 子节点) 父级查看事件是否已被消费,做收尾处理

监听和处理事件的方法(以 Main 为例):

Modifier.pointerInput(Unit) { awaitPointerEventScope { while (true) { val change = awaitPointerEvent(PointerEventPass.Main).changes.first() when { change.changedToDown() -> {} // down 事件 change.positionChanged() -> {} // moved 事件 change.changedToUp() -> {} // up 事件 } logi("事件是否已消费: ${change.isConsumed}") change.consume() // 消费事件 } } }

值得注意的是,传统 View 体系在事件被消费后续就不会回调,而 compose 的事件不管有没有消费都会有回调,通过 isConsumed 字段来判断是否已被消费。compose 的事件分发体系相对来说信息更完整


一般情况下,优先使用高层 API:

Modifier.clickable { } Modifier.draggable(...) Modifier.scrollable(...)

高层手势的API 和 底层手势 API 混用时需要注意顺序,一般是先高层再底层

Modifier .clickable { } .pointerInput(Unit) { }

如果反了的话

Modifier .pointerInput(Unit) { } .clickable { }

pointerInput 接收到的事件就很有可能是 isConsumed 状态 从而影响判断


总结:
Compose 的事件分发可以用一句话概括:同一个指针事件会经过 Initial、Main、Final 三个阶段,在父子节点之间来回传递,组件通过消费事件来影响后续处理。

理解了这三个阶段,就能更好地处理 Compose 中的点击冲突、嵌套滚动、自定义拖拽、多指手势以及复杂组件交互。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 7:31:09

区块链+AI+边缘计算:构建可信、高效的糖尿病风险预测系统

1. 项目概述与核心价值作为一名在医疗健康与人工智能交叉领域摸爬滚打了十多年的从业者,我见证过太多“概念很酷,落地很难”的项目。今天想和大家深入聊聊一个将区块链与人工智能结合,用于糖尿病预测的实战项目。这不仅仅是又一个“AI医疗”的…

作者头像 李华
网站建设 2026/5/23 7:25:56

深度剖析LiteOS-M内核队列:数据结构、算法与嵌入式IPC实践

1. 项目概述与核心价值最近在深度研究LiteOS-M内核源码,特别是其进程间通信(IPC)机制中的队列模块。队列作为一种基础且高效的异步通信方式,在资源受限的嵌入式系统中扮演着至关重要的角色。它不像消息队列那样承载复杂的业务数据…

作者头像 李华
网站建设 2026/5/23 7:24:41

XUnity Auto Translator:打破语言壁垒的Unity游戏翻译解决方案

XUnity Auto Translator:打破语言壁垒的Unity游戏翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过精彩的Unity游戏?面对日文、韩文或其他…

作者头像 李华
网站建设 2026/5/23 7:24:08

DownKyi终极教程:轻松下载B站8K超高清视频的完整指南

DownKyi终极教程:轻松下载B站8K超高清视频的完整指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#x…

作者头像 李华
网站建设 2026/5/23 7:22:34

Altium Designer CAD与布线实战:硬件工程师高效设计指南

1. 项目概述:为什么AD的CAD与布线是硬件工程师的“左右手”?干了十几年硬件设计,从最初的Protel 99 SE一路用到现在的Altium Designer,我越来越觉得,一个优秀的硬件工程师,必须像熟悉自己的左右手一样&…

作者头像 李华
网站建设 2026/5/23 7:22:24

MPLAB X IDE配置位自动生成:告别手动计算,提升PIC开发效率

1. 项目概述:告别手动配置的烦恼如果你正在使用Microchip的PIC单片机,并且已经用上了官方的MPLAB X IDE,那么配置位(Configuration Bits)这个词对你来说一定不陌生。它就像是单片机的“出生证明”和“初始设定”&#…

作者头像 李华