handleEvent method
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, HitTestEntry entry) {
assert(debugHandleEvent(event, entry));
assert(
() {
for (final region in _registeredRegions) {
if (!region.enabled) {
return false;
}
}
return true;
}(),
'A MouseAreaRegion was registered when it was disabled.',
);
if (_registeredRegions.isEmpty) {
return;
}
final result = _cachedResults[entry];
if (result == null) {
return;
}
// A child was hit, so we need to call onExit for those regions or
// groups of regions that were not hit.
final hitRegions = _getRegionsHit(
_registeredRegions,
result.path,
).cast<ShadMouseAreaRenderBox>().toSet();
final insideRegions = <ShadMouseAreaRenderBox>{
for (final ShadMouseAreaRenderBox region in hitRegions)
if (region.groupId == null)
region
// Adding all grouped regions, so they act as a single region.
else
..._groupIdToRegions[region.groupId]!,
};
// If they're not inside, then they're outside.
final outsideRegions = _registeredRegions.difference(insideRegions);
for (final region in outsideRegions) {
region.onExit?.call(
PointerExitEvent(
viewId: event.viewId,
timeStamp: event.timeStamp,
pointer: event.pointer,
device: event.device,
position: event.position,
delta: event.delta,
buttons: event.buttons,
obscured: event.obscured,
pressureMin: event.pressureMin,
pressureMax: event.pressureMax,
distance: event.distance,
distanceMax: event.distanceMax,
size: event.size,
radiusMajor: event.radiusMajor,
radiusMinor: event.radiusMinor,
radiusMin: event.radiusMin,
radiusMax: event.radiusMax,
orientation: event.orientation,
tilt: event.tilt,
down: event.down,
synthesized: event.synthesized,
embedderId: event.embedderId,
),
);
}
for (final region in insideRegions) {
region.onEnter?.call(
PointerEnterEvent(
viewId: event.viewId,
timeStamp: event.timeStamp,
pointer: event.pointer,
device: event.device,
position: event.position,
delta: event.delta,
buttons: event.buttons,
obscured: event.obscured,
pressureMin: event.pressureMin,
pressureMax: event.pressureMax,
distance: event.distance,
distanceMax: event.distanceMax,
size: event.size,
radiusMajor: event.radiusMajor,
radiusMinor: event.radiusMinor,
radiusMin: event.radiusMin,
radiusMax: event.radiusMax,
orientation: event.orientation,
tilt: event.tilt,
down: event.down,
synthesized: event.synthesized,
embedderId: event.embedderId,
),
);
}
}