GestureBinding 文档理解

90 阅读4分钟

Lifecycle of pointer events and the gesture arena

PointerDownEvent

When a PointerDownEvent is received by the GestureBinding (from dart:ui.PlatformDispatcher.onPointerDataPacket, as interpreted by the PointerEventConverter), a hitTest is performed to determine which HitTestTarget nodes are affected. (Other bindings are expected to implement hitTest to defer to HitTestable objects. For example, the rendering layer defers to the RenderView and the rest of the render object hierarchy.)

当按下事件(PointerDownEvent)被接收到,hittest被执行,去决定哪些HitTestTarget被影响。

The affected nodes then are given the event to handle (dispatchEvent calls HitTestTarget.handleEvent for each affected node). If any have relevant GestureRecognizers, they provide the event to them using GestureRecognizer.addPointer. This typically causes the recognizer to register with the PointerRouter to receive notifications regarding the pointer in question.

事件被送到受影响的节点去处理,如果有相关的手势,手势会通过,GestureRecognizer.addPointer方法接收到事件,这导致识别器注册 PointerRouter去接收时间通知。

Once the hit test and dispatching logic is complete, the event is then passed to the aforementioned PointerRouter, which passes it to any objects that have registered interest in that event.

当hit test 和派发逻辑完成后,事件被送往PointerRouter,PointerRouter被送往关注事件的对象。

Finally, the gestureArena is closed for the given pointer (GestureArenaManager.close), which begins the process of selecting a gesture to win that pointer.

最后gestureArena被关闭,获胜的手势去处理事件。

Other events

A pointer that is PointerEvent.down may send further events, such as PointerMoveEvent, PointerUpEvent, or PointerCancelEvent. These are sent to the same HitTestTarget nodes as were found when the PointerDownEvent was received (even if they have since been disposed; it is the responsibility of those objects to be aware of that possibility).

PointerEvent.down后续的事件被送到先前发送的 HitTestTarget中。

Then, the events are routed to any still-registered entrants in the PointerRouter's table for that pointer.

When a PointerUpEvent is received, the GestureArenaManager.sweep method is invoked to force the gesture arena logic to terminate if necessary.

PointerUpEvent收到的时候,GestureArenaManager.sweep强迫终止手势竞争逻辑。

Properties

pointerRouter → PointerRouter A router that routes all pointer events received from the engine. final gestureArena → GestureArenaManager The gesture arenas used for disambiguating the meaning of sequences of pointer events. final pointerSignalResolver → PointerSignalResolver The resolver used for determining which widget handles a PointerSignalEvent. final resamplingEnabled ↔ bool Enable pointer event resampling for touch devices by setting this to true. read / write samplingOffset ↔ Duration Offset relative to current frame time that should be used for resampling. The samplingOffset is expected to be negative. Non-negative samplingOffset is allowed but will effectively disable resampling. read / write debugSamplingClock → SamplingClock? Overrides the sampling clock for debugging and testing. @protected, read-only window → SingletonFlutterWindow The main window to which this binding is bound. read-only, inherited platformDispatcher → PlatformDispatcher The ui.PlatformDispatcher to which this binding is bound. read-only, inherited locked → bool Whether lockEvents is currently locking events. @protected, read-only, inherited hashCode → int The hash code for this object. read-only, inherited runtimeType → Type A representation of the runtime type of the object. read-only, inherited Methods

cancelPointer(int pointer) → void Dispatch a PointerCancelEvent for the given pointer soon. dispatchEvent(PointerEvent event, HitTestResult? hitTestResult) → void Dispatch an event to pointerRouter and the path of a hit test result. override handleEvent(PointerEvent event, HitTestEntry entry) → void Override this method to receive events. override handlePointerEvent(PointerEvent event) → void Dispatch an event to the targets found by a hit test on its position. hitTest(HitTestResult result, Offset position) → void Determine which HitTestTarget objects are located at a given position. override initInstances() → void The initialization method. Subclasses override this method to hook into the platform and otherwise configure their services. Subclasses must call "super.initInstances()". override initServiceExtensions() → void Called when the binding is initialized, to register service extensions. @mustCallSuper, @protected, inherited lockEvents(Future callback()) → Future Locks the dispatching of asynchronous events and callbacks until the callback's future completes. @protected, inherited noSuchMethod(Invocation invocation) → dynamic Invoked when a non-existent method or property is accessed. inherited performReassemble() → Future This method is called by reassembleApplication to actually cause the application to reassemble, e.g. after a hot reload. @mustCallSuper, @protected, inherited postEvent(String eventKind, Map<String, dynamic> eventData) → void All events dispatched by a BindingBase use this method instead of calling developer.postEvent directly so that tests for BindingBase can track which events were dispatched by overriding this method. @protected, inherited reassembleApplication() → Future Cause the entire application to redraw, e.g. after a hot reload. inherited registerBoolServiceExtension({required String name, required AsyncValueGetter getter, required AsyncValueSetter setter}) → void Registers a service extension method with the given name (full name "ext.flutter.name"), which takes a single argument "enabled" which can have the value "true" or the value "false" or can be omitted to read the current value. (Any value other than "true" is considered equivalent to "false". Other arguments are ignored.) @protected, inherited registerNumericServiceExtension({required String name, required AsyncValueGetter getter, required AsyncValueSetter setter}) → void Registers a service extension method with the given name (full name "ext.flutter.name"), which takes a single argument with the same name as the method which, if present, must have a value that can be parsed by double.parse, and can be omitted to read the current value. (Other arguments are ignored.) @protected, inherited registerServiceExtension({required String name, required ServiceExtensionCallback callback}) → void Registers a service extension method with the given name (full name "ext.flutter.name"). @protected, inherited registerSignalServiceExtension({required String name, required AsyncCallback callback}) → void Registers a service extension method with the given name (full name "ext.flutter.name"), which takes no arguments and returns no value. @protected, inherited registerStringServiceExtension({required String name, required AsyncValueGetter getter, required AsyncValueSetter setter}) → void Registers a service extension method with the given name (full name "ext.flutter.name"), which optionally takes a single argument with the name "value". If the argument is omitted, the value is to be read, otherwise it is to be set. Returns the current value. @protected, inherited resetGestureBinding() → void Reset states of GestureBinding. @protected toString() → String A string representation of this object. inherited unlocked() → void Called by lockEvents when events get unlocked. override Operators

operator ==(Object other) → bool The equality operator. inherited Static Properties

instance → GestureBinding The singleton instance of this object. read-only