每日见闻之尝试大白话说清Flutter的事件传递

1 手指按下

手指按下会做以下几件事

1.1 进行hitTest 从根节点一级一级的进行hitTest 找到所有可以处理这个事件的 RenderObject,RendObject 实现了HitTestTarget,所以也可以说找到所有能处理这个事件的 HitTestTarget,最终返回HitTestResult,HitTestResult的path 里面保存了所有命中的RenderObject。

1.2 依次调用所有命中的RendObject(HitTestTarget) 的 handleEvent

2 手指按下之后的事件都是通过 PointerRouter.route 下发的。并不直接再次调用最终返回HitTestResult中保存的RenderObjecthandleEvent方法。所以命中的RenderObject能不能接收到后续的事件由PointerRouter决定。

3 我们一般是使用GestureDetector来进行事件的注册。

3.1 我们来简单捋一下 GestureDetector - build - RawGestureDetector- RawGestureDetectorState - build - Listener

3.2 最终我们定位到Listener组建,Listener组建是个RenderObjectWidget,所以他也是有对应的RenderObject,在对应的RenderObjecthandleEvent方法中收到down事件的时候,ListeneronPointerDown 会执行

4 我们接着分析Listener的onPointerDown方法

scss 复制代码
void _handlePointerDown(PointerDownEvent event) {
 assert(_recognizers != null);
 for (final GestureRecognizer recognizer in _recognizers!.values) {
   recognizer.addPointer(event);
 }
}

这个地方的 _recognizers 我们不纠结,就理解成我们我们在使用GestureDetector注册事件的时候,根据注册的事件会生成不同GestureRecognizer,真正判断这个事件是单击还是长按,具体逻辑都在对应的GestureRecognizer实现类里面。

我们看addPoint方法。如果处理这个事件就会继续走 addAllowedPointer

csharp 复制代码
void addPointer(PointerDownEvent event) {
  _pointerToKind[event.pointer] = event.kind;
  if (isPointerAllowed(event)) {
    addAllowedPointer(event);
  } else {
    handleNonAllowedPointer(event);
  }
}

再看 addAllowedPointer,不同的GestureDetector 实现方式不一样,但是归根结底都会调用到GestureBinding.instance.pointerRouter.addRoute(pointer, handleEvent, transform)

less 复制代码
@override
@protected
void addAllowedPointer(PointerDownEvent event) {
  startTrackingPointer(event.pointer, event.transform);
}
arduino 复制代码
@protected
void startTrackingPointer(int pointer, [Matrix4? transform]) {
  GestureBinding.instance.pointerRouter.addRoute(pointer, handleEvent, transform);
  ...
}

注册handleEvent到pointerRouter,以接收后续的事件。

相关推荐
麒麟ZHAO几秒前
鸿蒙flutter第三方库适配 - 文件对比工具
数据库·redis·flutter·华为·harmonyos
weixin_443478512 分钟前
Flutter组件学习之图表
学习·flutter·信息可视化
猿饵块2 分钟前
flutter--基础环境安装
flutter
见山是山-见水是水1 小时前
Flutter 框架跨平台鸿蒙开发 - 电子发票智能管理
flutter·华为·harmonyos
MonkeyKing1 小时前
Flutter刷新机制与重建优化
flutter
空中海2 小时前
4.4 动态与嵌套路由
flutter
2401_839633912 小时前
鸿蒙flutter第三方库适配 - 存储空间分析
flutter·华为·harmonyos
加农炮手Jinx3 小时前
Flutter 三方库 better_commit 的鸿蒙化适配指南 - 实现具备语义化提交规范与自动化交互的 Git 工作流插件、支持端侧版本工程的高效规范化审计实战
flutter·harmonyos·鸿蒙·openharmony·better_commit
空中海3 小时前
3.3 第三方框架
flutter·dart
麒麟ZHAO3 小时前
鸿蒙flutter第三方库适配 - 文件搜索工具
flutter·华为·harmonyos