diff --git a/packages/flutter/lib/src/gestures/arena.dart b/packages/flutter/lib/src/gestures/arena.dart index 50c7a5b00cd..df7b585734d 100644 --- a/packages/flutter/lib/src/gestures/arena.dart +++ b/packages/flutter/lib/src/gestures/arena.dart @@ -146,8 +146,7 @@ class GestureArena { } else { assert(disposition == GestureDisposition.accepted); if (state.isOpen) { - if (state.eagerWinner == null) - state.eagerWinner = member; + state.eagerWinner ??= member; } else { _resolveInFavorOf(key, state, member); } @@ -166,4 +165,4 @@ class GestureArena { } member.acceptGesture(key); } -} \ No newline at end of file +} diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index 5c5c5a8abaf..bfa1c6fb518 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -112,7 +112,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni // TODO(abarth): Maybe factor the slop handling out into a separate class? if (event.type == 'pointermove' && _getDistance(event) > kTouchSlop) { resolve(GestureDisposition.rejected); - stopTrackingPointer(event.pointer); + stopTrackingPointer(primaryPointer); } else { handlePrimaryPointer(event); } diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart index c4304fe91ac..8523558de4f 100644 --- a/packages/flutter/lib/src/gestures/tap.dart +++ b/packages/flutter/lib/src/gestures/tap.dart @@ -43,6 +43,15 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { } } + void resolve(GestureDisposition disposition) { + if (_wonArena && disposition == GestureDisposition.rejected) { + if (onTapCancel != null) + onTapCancel(); + _reset(); + } + super.resolve(disposition); + } + void didExceedDeadline() { _checkDown(); } diff --git a/packages/unit/test/gestures/tap_test.dart b/packages/unit/test/gestures/tap_test.dart index 4ddabffd7e4..d1b8b7e054f 100644 --- a/packages/unit/test/gestures/tap_test.dart +++ b/packages/unit/test/gestures/tap_test.dart @@ -161,19 +161,28 @@ void main() { tap.onTap = () { tapRecognized = true; }; + bool tapCanceled = false; + tap.onTapCancel = () { + tapCanceled = true; + }; tap.addPointer(down3); GestureArena.instance.close(3); expect(tapRecognized, isFalse); + expect(tapCanceled, isFalse); router.route(down3); expect(tapRecognized, isFalse); + expect(tapCanceled, isFalse); router.route(move3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); router.route(up3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); GestureArena.instance.sweep(3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); tap.dispose(); });