1分钟
01 事件流程
在前面的流程图中我们知道,在 Dart 层中手势事件都是从 _dispatchPointerDataPacket
开始的,之后会通过 Zone
判断环境回调,会执行 GestureBinding
这个胶水类中的 _handlePointerEvent
方法。(如果对 Zone
或者 GestureBinding
有疑问可以翻阅前面的篇章)
如下代码所示, GestureBinding
的 _handlePointerEvent
方法中主要是 hitTest
和 dispatchEvent
: 通过 hitTest
碰撞,得到一个包含控件的待处理成员列表 HitTestResult
,然后通过 dispatchEvent
分发事件并产生竞争,得到胜利者相应。
void _handlePointerEvent(PointerEvent event) {
assert(!locked);
HitTestResult hitTestResult;
if (event is PointerDownEvent || event is PointerSignalEvent) {
hitTestResult = HitTestResult();
///开始碰撞测试了,会添加各个控件,得到一个需要处理的控件成员列表
hitTest(hitTestResult, event.position);
if (event is PointerDownEvent) {
_hitTests[event.pointer] = hitTestResult;
}
} else if (event is PointerUpEvent || event is PointerCancelEvent) {
///复用机制,抬起和取消,不用hitTest,移除
hitTestResult = _hitTests.remove(event.pointer);
} else if (event.down) {
///复用机制,手指处于滑动中,不用hitTest
hitTestResult = _hitTests[event.pointer];
}
if (hitTestResult != null ||
event is PointerHoverEvent ||
event is PointerAddedEvent ||
event is PointerRemovedEvent) {
///开始分发事件
dispatchEvent(event, hitTestResult);
}
}
了解了结果后,接下来深入分析这两个关键方法:
学员评价