Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7a4c334

Browse files
committedMay 1, 2019
cherry-pick: fix edge swiping and dropping back at starting point (#31623)
1 parent 09cbc34 commit 7a4c334

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
 

‎packages/flutter/lib/src/cupertino/route.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ class _CupertinoBackGestureController<T> {
621621
animateForward = velocity > 0 ? false : true;
622622
else
623623
animateForward = controller.value > 0.5 ? true : false;
624+
624625
if (animateForward) {
625626
// The closer the panel is to dismissing, the shorter the animation is.
626627
// We want to cap the animation time, but we want to use a linear curve
@@ -652,6 +653,8 @@ class _CupertinoBackGestureController<T> {
652653
controller.removeStatusListener(animationStatusCallback);
653654
};
654655
controller.addStatusListener(animationStatusCallback);
656+
} else {
657+
navigator.didStopUserGesture();
655658
}
656659
}
657660
}

‎packages/flutter/test/cupertino/route_test.dart

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ void main() {
351351
await tester.pumpAndSettle();
352352
expect(find.text('route'), findsOneWidget);
353353
expect(find.text('push'), findsNothing);
354+
expect(
355+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
356+
false,
357+
);
354358
});
355359

356360
testWidgets('Fullscreen route animates correct transform values over time', (WidgetTester tester) async {
@@ -536,6 +540,10 @@ void main() {
536540
await tester.pump();
537541
expect(tester.getTopLeft(find.text('1')).dx, moreOrLessEquals(-233, epsilon: 1));
538542
expect(tester.getTopLeft(find.text('2')).dx, moreOrLessEquals(100));
543+
expect(
544+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
545+
true,
546+
);
539547

540548
await swipeGesture.moveBy(const Offset(100, 0));
541549
await tester.pump();
@@ -576,6 +584,10 @@ void main() {
576584
await tester.pump();
577585
expect(tester.getTopLeft(find.text('1')).dx, moreOrLessEquals(-100));
578586
expect(tester.getTopLeft(find.text('2')).dx, moreOrLessEquals(500));
587+
expect(
588+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
589+
true,
590+
);
579591

580592
await tester.pump(const Duration(milliseconds: 50));
581593
expect(tester.getTopLeft(find.text('1')).dx, moreOrLessEquals(-19, epsilon: 1));
@@ -585,6 +597,12 @@ void main() {
585597
// Rate of change is slowing down.
586598
expect(tester.getTopLeft(find.text('1')).dx, moreOrLessEquals(-4, epsilon: 1));
587599
expect(tester.getTopLeft(find.text('2')).dx, moreOrLessEquals(787, epsilon: 1));
600+
601+
await tester.pumpAndSettle();
602+
expect(
603+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
604+
false,
605+
);
588606
});
589607

590608
testWidgets('Snapped drags forwards and backwards should signal didStart/StopUserGesture', (WidgetTester tester) async {
@@ -667,12 +685,63 @@ void main() {
667685
final TestGesture gesture = await tester.startGesture(const Offset(5, 200));
668686
// The width of the page.
669687
await gesture.moveBy(const Offset(800, 0));
688+
verify(navigatorObserver.didStartUserGesture(any, any)).called(1);
670689
await gesture.up();
671690
await tester.pump();
672691

673692
expect(find.text('Page 1'), isOnstage);
674693
expect(find.text('Page 2'), findsNothing);
675694
verify(navigatorObserver.didPop(any, any)).called(1);
695+
verify(navigatorObserver.didStopUserGesture()).called(1);
696+
});
697+
698+
testWidgets('test edge swipe then drop back at starting point works', (WidgetTester tester) async {
699+
await tester.pumpWidget(
700+
CupertinoApp(
701+
navigatorObservers: <NavigatorObserver>[navigatorObserver],
702+
onGenerateRoute: (RouteSettings settings) {
703+
return CupertinoPageRoute<void>(
704+
settings: settings,
705+
builder: (BuildContext context) {
706+
final String pageNumber = settings.name == '/' ? '1' : '2';
707+
return Center(child: Text('Page $pageNumber'));
708+
},
709+
);
710+
},
711+
),
712+
);
713+
714+
tester.state<NavigatorState>(find.byType(Navigator)).pushNamed('/next');
715+
716+
await tester.pump();
717+
await tester.pump(const Duration(seconds: 1));
718+
719+
expect(find.text('Page 1'), findsNothing);
720+
expect(find.text('Page 2'), isOnstage);
721+
722+
final TestGesture gesture = await tester.startGesture(const Offset(5, 200));
723+
// Move right a bit
724+
await gesture.moveBy(const Offset(300, 0));
725+
verify(navigatorObserver.didStartUserGesture(any, any)).called(1);
726+
expect(
727+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
728+
true,
729+
);
730+
await tester.pump();
731+
732+
// Move back to where we started.
733+
await gesture.moveBy(const Offset(-300, 0));
734+
await gesture.up();
735+
await tester.pump();
736+
737+
expect(find.text('Page 1'), findsNothing);
738+
expect(find.text('Page 2'), isOnstage);
739+
verifyNever(navigatorObserver.didPop(any, any));
740+
verify(navigatorObserver.didStopUserGesture()).called(1);
741+
expect(
742+
tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress,
743+
false,
744+
);
676745
});
677746
}
678747

0 commit comments

Comments
 (0)
Please sign in to comment.