diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index ba620aa38f..3d41f8e6ed 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -463,6 +463,13 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni } } + @override + void handleNonAllowedPointer(PointerDownEvent event) { + if (!_gestureAccepted) { + super.handleNonAllowedPointer(event); + } + } + @override void handleEvent(PointerEvent event) { assert(state != GestureRecognizerState.ready); diff --git a/packages/flutter/test/gestures/long_press_test.dart b/packages/flutter/test/gestures/long_press_test.dart index 943c57adc8..81ee4e4f7b 100644 --- a/packages/flutter/test/gestures/long_press_test.dart +++ b/packages/flutter/test/gestures/long_press_test.dart @@ -288,6 +288,29 @@ void main() { longPress.dispose(); }); + + testGesture('non-allowed pointer does not inadvertently reset the recognizer', (GestureTester tester) { + longPress = LongPressGestureRecognizer(kind: PointerDeviceKind.touch)..onLongPress = () {}; + + // Accept a long-press gesture + longPress.addPointer(down); + tester.closeArena(5); + tester.route(down); + tester.async.elapse(const Duration(milliseconds: 500)); + + // Add a non-allowed pointer (doesn't match the kind filter) + longPress.addPointer(const PointerDownEvent( + pointer: 101, + kind: PointerDeviceKind.mouse, + position: Offset(10, 10), + )); + + // Moving the primary pointer should result in a normal event + tester.route(const PointerMoveEvent( + pointer: 5, + position: Offset(15, 15), + )); + }); }); group('long press drag', () {