大道同源, 其实Flutter的事件分发跟安卓类似。 下面就详细介绍下Flutter的事件分发体系:
1、 Flutter所有事件源头是 hooks.dart文件的_dispatchPointerDataPacket函数, 接收屏幕的点击、滑动等等各种事件。 类似于安卓的ViewRootImpl.java接收native层的数据。
2、gestures/binding.dart中的GestureBinding是Flutter事件分发的基类, 它的成员函数dispatchEvent、handleEvent和hitTest是核心函数, 从事件队列里按照先入先出方式处理PointerEvent。 处理_dispatchPointerDataPacket发来的数据。
mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, HitTestTarget {
@override
void initInstances() {
super.initInstances();
_instance = this;
ui.window.onPointerDataPacket = _handlePointerDataPacket;
}
3、converter.dart将物理坐标_dispatchPointerDataPacket收到的物理数据PointerDataPacket转换成PointerEvent, 类似于安卓在ViewRootImpl.java将InputEventReceiver收到的InputEvent转换为MotionEvent。
4、recognizer.dart的GestureRecognizer是所有手势识别的基类,
5、rendering/binding.dart的RendererBinding类关联了render树和Flutter引擎, 暂且理解为安卓的Surface。
6、view.dart的RenderView是render树的根节点, 可以理解为安卓的DecorView。
下面详细介绍事件的分发流程:
1、Flutter框架初始化会调用runApp方法, 它的作用是初始化各个binging;其中GestureBinding就是处理事件分发的。 attachRootWidget就是设置根节点, 可以看到真正的根节点是renderview, 也是Flutter事件分发的起点。
void r