simulateSwipe method
Simulates a swipe from start to end over duration.
Linear interpolation of 20 steps using Future.delayed to respect timing. Flutter needs to see intermediate PointerMoveEvents to recognize the gesture as a swipe and not as a long press.
Note: the Future.delayed calls are intentionally fire-and-forget — the caller does not need to wait for all events to be emitted because Flutter processes them on the same UI isolate.
Implementation
void simulateSwipe(Offset start, Offset end, Duration duration) {
const steps = 20;
final stepMs = duration.inMilliseconds ~/ steps;
final pointer = _nextPointer;
Log.i(
'[Gesture] 👉 SWIPE de $start a $end (${duration.inMilliseconds}ms, $steps pasos)',
);
GestureBinding.instance.handlePointerEvent(
PointerDownEvent(position: start, pointer: pointer),
);
for (int i = 1; i <= steps; i++) {
final t = i / steps;
final pos = Offset.lerp(start, end, t)!;
Future.delayed(Duration(milliseconds: stepMs * i), () {
GestureBinding.instance.handlePointerEvent(
PointerMoveEvent(position: pos, pointer: pointer),
);
});
}
Future.delayed(duration, () {
GestureBinding.instance.handlePointerEvent(
PointerUpEvent(position: end, pointer: pointer),
);
});
}