feat: show back and forward swipes as visible page transitions
This commit is contained in:
parent
65e693b9c6
commit
204aee899a
4 changed files with 387 additions and 11 deletions
127
app/test/swipe_navigator_test.dart
Normal file
127
app/test/swipe_navigator_test.dart
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:mews/presentation/reader/swipe_navigator.dart';
|
||||
|
||||
Widget _wrap(SwipeNavigator navigator) => MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Center(
|
||||
child: SizedBox(
|
||||
width: 800,
|
||||
height: 600,
|
||||
child: navigator,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
SwipeNavigator _navigator({
|
||||
required VoidCallback onBack,
|
||||
required VoidCallback onForward,
|
||||
bool canGoBack = true,
|
||||
bool canGoForward = true,
|
||||
}) =>
|
||||
SwipeNavigator(
|
||||
canGoBack: canGoBack,
|
||||
canGoForward: canGoForward,
|
||||
backTitle: 'Previous page',
|
||||
forwardTitle: 'Next page',
|
||||
background: const Color(0xfffaf8f3),
|
||||
onBack: onBack,
|
||||
onForward: onForward,
|
||||
child: const ColoredBox(
|
||||
color: Color(0xff18191b),
|
||||
child: SizedBox.expand(),
|
||||
),
|
||||
);
|
||||
|
||||
void main() {
|
||||
testWidgets('dragging right reveals the previous page and commits',
|
||||
(tester) async {
|
||||
var back = 0;
|
||||
var forward = 0;
|
||||
await tester.pumpWidget(_wrap(_navigator(
|
||||
onBack: () => back++,
|
||||
onForward: () => forward++,
|
||||
)));
|
||||
|
||||
final center = tester.getCenter(find.byType(SwipeNavigator));
|
||||
final gesture = await tester.startGesture(center);
|
||||
await gesture.moveBy(const Offset(300, 0));
|
||||
await tester.pump();
|
||||
|
||||
// The neighbor is peeking in with its title while the page slides away.
|
||||
expect(find.text('Previous page'), findsOneWidget);
|
||||
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(back, 1);
|
||||
expect(forward, 0);
|
||||
});
|
||||
|
||||
testWidgets('dragging left commits forward navigation', (tester) async {
|
||||
var back = 0;
|
||||
var forward = 0;
|
||||
await tester.pumpWidget(_wrap(_navigator(
|
||||
onBack: () => back++,
|
||||
onForward: () => forward++,
|
||||
)));
|
||||
|
||||
final center = tester.getCenter(find.byType(SwipeNavigator));
|
||||
final gesture = await tester.startGesture(center);
|
||||
await gesture.moveBy(const Offset(-300, 0));
|
||||
await tester.pump();
|
||||
expect(find.text('Next page'), findsOneWidget);
|
||||
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(forward, 1);
|
||||
expect(back, 0);
|
||||
});
|
||||
|
||||
testWidgets('a short drag springs back without navigating', (tester) async {
|
||||
var back = 0;
|
||||
await tester.pumpWidget(_wrap(_navigator(
|
||||
onBack: () => back++,
|
||||
onForward: () {},
|
||||
)));
|
||||
|
||||
final center = tester.getCenter(find.byType(SwipeNavigator));
|
||||
final gesture = await tester.startGesture(center);
|
||||
await gesture.moveBy(const Offset(80, 0));
|
||||
await tester.pump();
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(back, 0);
|
||||
// The neighbor disappeared again.
|
||||
expect(find.text('Previous page'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('directions without pages rubber-band and never commit',
|
||||
(tester) async {
|
||||
var back = 0;
|
||||
var forward = 0;
|
||||
await tester.pumpWidget(_wrap(_navigator(
|
||||
onBack: () => back++,
|
||||
onForward: () => forward++,
|
||||
canGoBack: false,
|
||||
canGoForward: false,
|
||||
)));
|
||||
|
||||
final center = tester.getCenter(find.byType(SwipeNavigator));
|
||||
final gesture = await tester.startGesture(center);
|
||||
await gesture.moveBy(const Offset(400, 0));
|
||||
await tester.pump();
|
||||
// No neighbor title shows when there is nothing to go back to.
|
||||
expect(find.text('Previous page'), findsNothing);
|
||||
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(back, 0);
|
||||
expect(forward, 0);
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue