feat: show back and forward swipes as visible page transitions

This commit is contained in:
randogoth 2026-10-11 10:38:50 +03:00
parent 65e693b9c6
commit 204aee899a
4 changed files with 387 additions and 11 deletions

View 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);
});
}