From b1d17c914dec8e09cf2cec5351afeef2996ff89e Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 17 Sep 2020 15:18:31 -0700 Subject: [PATCH] Deprecate VelocityTracker default constructor and added VelocityTracker.withKind constructor (#66043) We've gotten feedback that the VelocityTracker change was disruptive, though it did not break any of the flutter framework or customer tests. In order to make the change non-breaking, PointerDeviceKind parameter can be made optional. Nevertheless, this parameter should be provided so that the existing touch handlers can use more accurate gestures on mouse/stylus inputs, so we can encourage this by deprecating the default constructor and pointing users towards the VelocityTracker.withKind constructor that takes a non-optional parameter --- .../lib/gestures/velocity_tracker_bench.dart | 2 +- packages/flutter/lib/src/gestures/long_press.dart | 2 +- packages/flutter/lib/src/gestures/monodrag.dart | 2 +- packages/flutter/lib/src/gestures/multidrag.dart | 2 +- packages/flutter/lib/src/gestures/scale.dart | 2 +- .../flutter/lib/src/gestures/velocity_tracker.dart | 11 +++++++++-- .../flutter/lib/src/widgets/scroll_configuration.dart | 2 +- .../flutter/test/gestures/velocity_tracker_test.dart | 6 +++--- .../range_maintaining_scroll_physics_test.dart | 2 +- .../flutter/test/widgets/scroll_behavior_test.dart | 2 +- 10 files changed, 20 insertions(+), 13 deletions(-) diff --git a/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart b/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart index 2287acab08b..ebb66307be2 100644 --- a/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart +++ b/dev/benchmarks/microbenchmarks/lib/gestures/velocity_tracker_bench.dart @@ -20,7 +20,7 @@ void main() { assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'."); final BenchmarkResultPrinter printer = BenchmarkResultPrinter(); final List benchmarks = [ - TrackerBenchmark(name: 'velocity_tracker_iteration', tracker: VelocityTracker(PointerDeviceKind.touch)), + TrackerBenchmark(name: 'velocity_tracker_iteration', tracker: VelocityTracker.withKind(PointerDeviceKind.touch)), TrackerBenchmark(name: 'velocity_tracker_iteration_ios_fling', tracker: IOSScrollViewFlingVelocityTracker(PointerDeviceKind.touch)), ]; final Stopwatch watch = Stopwatch(); diff --git a/packages/flutter/lib/src/gestures/long_press.dart b/packages/flutter/lib/src/gestures/long_press.dart index c37b1edf7a0..300de65b0f6 100644 --- a/packages/flutter/lib/src/gestures/long_press.dart +++ b/packages/flutter/lib/src/gestures/long_press.dart @@ -376,7 +376,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer { void handlePrimaryPointer(PointerEvent event) { if (!event.synthesized) { if (event is PointerDownEvent) { - _velocityTracker = VelocityTracker(event.kind); + _velocityTracker = VelocityTracker.withKind(event.kind); _velocityTracker!.addPosition(event.timeStamp, event.localPosition); } if (event is PointerMoveEvent) { diff --git a/packages/flutter/lib/src/gestures/monodrag.dart b/packages/flutter/lib/src/gestures/monodrag.dart index 829a66531e4..602fff72a07 100644 --- a/packages/flutter/lib/src/gestures/monodrag.dart +++ b/packages/flutter/lib/src/gestures/monodrag.dart @@ -69,7 +69,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer { }) : assert(dragStartBehavior != null), super(debugOwner: debugOwner, kind: kind); - static VelocityTracker _defaultBuilder(PointerEvent event) => VelocityTracker(event.kind); + static VelocityTracker _defaultBuilder(PointerEvent event) => VelocityTracker.withKind(event.kind); /// Configure the behavior of offsets sent to [onStart]. /// /// If set to [DragStartBehavior.start], the [onStart] callback will be called diff --git a/packages/flutter/lib/src/gestures/multidrag.dart b/packages/flutter/lib/src/gestures/multidrag.dart index 91b1e328302..4c347f34880 100644 --- a/packages/flutter/lib/src/gestures/multidrag.dart +++ b/packages/flutter/lib/src/gestures/multidrag.dart @@ -30,7 +30,7 @@ abstract class MultiDragPointerState { /// The [initialPosition] argument must not be null. MultiDragPointerState(this.initialPosition, this.kind) : assert(initialPosition != null), - _velocityTracker = VelocityTracker(kind); + _velocityTracker = VelocityTracker.withKind(kind); /// The global coordinates of the pointer when the pointer contacted the screen. final Offset initialPosition; diff --git a/packages/flutter/lib/src/gestures/scale.dart b/packages/flutter/lib/src/gestures/scale.dart index ab517d01e3f..b75b439f0fc 100644 --- a/packages/flutter/lib/src/gestures/scale.dart +++ b/packages/flutter/lib/src/gestures/scale.dart @@ -286,7 +286,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { @override void addAllowedPointer(PointerEvent event) { startTrackingPointer(event.pointer, event.transform); - _velocityTrackers[event.pointer] = VelocityTracker(event.kind); + _velocityTrackers[event.pointer] = VelocityTracker.withKind(event.kind); if (_state == _ScaleState.ready) { _state = _ScaleState.possible; _initialSpan = 0.0; diff --git a/packages/flutter/lib/src/gestures/velocity_tracker.dart b/packages/flutter/lib/src/gestures/velocity_tracker.dart index d898d2bd68c..6739fff7250 100644 --- a/packages/flutter/lib/src/gestures/velocity_tracker.dart +++ b/packages/flutter/lib/src/gestures/velocity_tracker.dart @@ -149,7 +149,14 @@ class _PointAtTime { /// have been received. class VelocityTracker { /// Create a new velocity tracker for a pointer [kind]. - VelocityTracker(this.kind); + @Deprecated( + 'Use VelocityTracker.withKind and provide the PointerDeviceKind associated with the gesture being tracked. ' + 'This feature was deprecated after v1.22.0-12.1.pre.' + ) + VelocityTracker([this.kind = PointerDeviceKind.touch]); + + /// Create a new velocity tracker for a pointer [kind]. + VelocityTracker.withKind(this.kind); static const int _assumePointerMoveStoppedMilliseconds = 40; static const int _historySize = 20; @@ -281,7 +288,7 @@ class VelocityTracker { /// the iOS method that reports the fling velocity when the touch is released. class IOSScrollViewFlingVelocityTracker extends VelocityTracker { /// Create a new IOSScrollViewFlingVelocityTracker. - IOSScrollViewFlingVelocityTracker(PointerDeviceKind kind) : super(kind); + IOSScrollViewFlingVelocityTracker(PointerDeviceKind kind) : super.withKind(kind); /// The velocity estimation uses at most 4 `_PointAtTime` samples. The extra /// samples are there to make the `VelocityEstimate.offset` sufficiently large diff --git a/packages/flutter/lib/src/widgets/scroll_configuration.dart b/packages/flutter/lib/src/widgets/scroll_configuration.dart index 77f1fdaf6ee..a857d666dc3 100644 --- a/packages/flutter/lib/src/widgets/scroll_configuration.dart +++ b/packages/flutter/lib/src/widgets/scroll_configuration.dart @@ -75,7 +75,7 @@ class ScrollBehavior { case TargetPlatform.fuchsia: case TargetPlatform.linux: case TargetPlatform.windows: - return (PointerEvent event) => VelocityTracker(event.kind); + return (PointerEvent event) => VelocityTracker.withKind(event.kind); } } diff --git a/packages/flutter/test/gestures/velocity_tracker_test.dart b/packages/flutter/test/gestures/velocity_tracker_test.dart index afb27d5b0b4..e18d9469bf0 100644 --- a/packages/flutter/test/gestures/velocity_tracker_test.dart +++ b/packages/flutter/test/gestures/velocity_tracker_test.dart @@ -38,7 +38,7 @@ void main() { ]; test('Velocity tracker gives expected results', () { - final VelocityTracker tracker = VelocityTracker(PointerDeviceKind.touch); + final VelocityTracker tracker = VelocityTracker.withKind(PointerDeviceKind.touch); int i = 0; for (final PointerEvent event in velocityEventData) { if (event is PointerDownEvent || event is PointerMoveEvent) @@ -64,7 +64,7 @@ void main() { test('Interrupted velocity estimation', () { // Regression test for https://github.com/flutter/flutter/pull/7510 - final VelocityTracker tracker = VelocityTracker(PointerDeviceKind.touch); + final VelocityTracker tracker = VelocityTracker.withKind(PointerDeviceKind.touch); for (final PointerEvent event in interruptedVelocityEventData) { if (event is PointerDownEvent || event is PointerMoveEvent) tracker.addPosition(event.timeStamp, event.position); @@ -75,7 +75,7 @@ void main() { }); test('No data velocity estimation', () { - final VelocityTracker tracker = VelocityTracker(PointerDeviceKind.touch); + final VelocityTracker tracker = VelocityTracker.withKind(PointerDeviceKind.touch); expect(tracker.getVelocity(), Velocity.zero); }); diff --git a/packages/flutter/test/widgets/range_maintaining_scroll_physics_test.dart b/packages/flutter/test/widgets/range_maintaining_scroll_physics_test.dart index 95787397a86..6be992cbf28 100644 --- a/packages/flutter/test/widgets/range_maintaining_scroll_physics_test.dart +++ b/packages/flutter/test/widgets/range_maintaining_scroll_physics_test.dart @@ -310,7 +310,7 @@ class RangeMaintainingTestScrollBehavior extends ScrollBehavior { @override GestureVelocityTrackerBuilder velocityTrackerBuilder(BuildContext context) { - return (PointerEvent event) => VelocityTracker(event.kind); + return (PointerEvent event) => VelocityTracker.withKind(event.kind); } @override diff --git a/packages/flutter/test/widgets/scroll_behavior_test.dart b/packages/flutter/test/widgets/scroll_behavior_test.dart index e668bdae129..126f1afb53f 100644 --- a/packages/flutter/test/widgets/scroll_behavior_test.dart +++ b/packages/flutter/test/widgets/scroll_behavior_test.dart @@ -27,7 +27,7 @@ class TestScrollBehavior extends ScrollBehavior { @override GestureVelocityTrackerBuilder velocityTrackerBuilder(BuildContext context) { lastCreatedBuilder = flag - ? (PointerEvent ev) => VelocityTracker(ev.kind) + ? (PointerEvent ev) => VelocityTracker.withKind(ev.kind) : (PointerEvent ev) => IOSScrollViewFlingVelocityTracker(ev.kind); return lastCreatedBuilder; }