handleEvent method

  1. @override
void handleEvent(
  1. PointerEvent event,
  2. covariant _SpriteBoxHitTestEntry entry
)
override

Override this method to handle pointer events that hit this render object.

For RenderBox objects, the entry argument is a BoxHitTestEntry. From this object you can determine the PointerDownEvent's position in local coordinates. (This is useful because PointerEvent.position is in global coordinates.)

Implementations of this method should call debugHandleEvent as follows, so that they support debugPaintPointersEnabled:

class RenderFoo extends RenderBox {
  // ...

  @override
  void handleEvent(PointerEvent event, HitTestEntry entry) {
    assert(debugHandleEvent(event, entry));
    // ... handle the event ...
  }

  // ...
}

Implementation

@override
void handleEvent(PointerEvent event, _SpriteBoxHitTestEntry entry) {
  if (!attached) return;

  if (event is PointerDownEvent) {
    // Build list of event targets
    _addEventTargets();

    // Find the once that are hit by the pointer
    List<Node> nodeTargets = <Node>[];
    for (int i = _eventTargets!.length - 1; i >= 0; i--) {
      Node node = _eventTargets![i];

      // Check if the node is ready to handle a pointer
      if (node.handleMultiplePointers || node._handlingPointer == null) {
        // Do the hit test
        Offset posInNodeSpace =
            node.convertPointToNodeSpace(entry.localPosition);
        if (node.isPointInside(posInNodeSpace)) {
          nodeTargets.add(node);
          node._handlingPointer = event.pointer;
        }
      }
    }

    entry.nodeTargets = nodeTargets;
  }

  // Pass the event down to nodes that were hit by the pointerdown
  List<Node> targets = entry.nodeTargets;
  for (Node node in targets) {
    // Check if this event should be dispatched
    if (node.handleMultiplePointers ||
        event.pointer == node._handlingPointer) {
      // Dispatch event
      bool consumedEvent = node.handleEvent(
        SpriteBoxEvent(
          globalToLocal(event.position),
          _eventToEventType(event),
          event.pointer,
        ),
      );
      if (consumedEvent) break;
    }
  }

  // De-register pointer for nodes that doesn't handle multiple pointers
  for (Node node in targets) {
    if (event is PointerUpEvent || event is PointerCancelEvent) {
      node._handlingPointer = null;
    }
  }
}