[cross imports] navigator_test.dart (#190954)
This PR fixes cross imports in navigator_test.dart, except for one test
that is a regression test with TabBarView/TabController. (That test will
need to be moved first, and the old test be deleted, rewritten after it
was moved)
It also cleans up some bits around test routes.
Part of https://github.com/flutter/flutter/issues/177415
*If you had to change anything in the [flutter/tests] repo, include a
link to the migration guide as per the [breaking change policy].*
## Pre-launch Checklist
- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-new channel
on [Discord].
If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.
**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.
<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
diff --git a/packages/flutter/test/widgets/focus_traversal_test.dart b/packages/flutter/test/widgets/focus_traversal_test.dart
index b7a0985..14d4dc0 100644
--- a/packages/flutter/test/widgets/focus_traversal_test.dart
+++ b/packages/flutter/test/widgets/focus_traversal_test.dart
@@ -12,6 +12,7 @@
import 'button_tester.dart';
import 'semantics_tester.dart';
+import 'test_page_tester.dart';
import 'utils.dart';
void main() {
@@ -3956,13 +3957,16 @@
final focusIntentWithCallback = RequestFocusIntent(
nodeA,
- requestFocusCallback: (
- FocusNode node, {
- double? alignment,
- ScrollPositionAlignmentPolicy? alignmentPolicy,
- Curve? curve,
- Duration? duration,
- }) => calledCallback = true,
+ requestFocusCallback:
+ (
+ FocusNode node, {
+ double? alignment,
+ ScrollPositionAlignmentPolicy? alignmentPolicy,
+ Curve? curve,
+ Duration? duration,
+ }) {
+ calledCallback = true;
+ },
);
RequestFocusAction().invoke(focusIntentWithCallback);
@@ -4207,24 +4211,6 @@
);
}
-class TestPage<T> extends Page<T> {
- const TestPage({required this.child, super.key, super.name});
-
- final Widget child;
-
- @override
- Route<T> createRoute(BuildContext context) {
- return PageRouteBuilder<T>(
- settings: this,
- pageBuilder: (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- ) => child,
- );
- }
-}
-
/// Used to test removal of nodes while sorting.
class SkipAllButFirstAndLastPolicy extends FocusTraversalPolicy
with DirectionalFocusTraversalPolicyMixin {
diff --git a/packages/flutter/test/widgets/navigator_test.dart b/packages/flutter/test/widgets/navigator_test.dart
index dea05c5..5331316 100644
--- a/packages/flutter/test/widgets/navigator_test.dart
+++ b/packages/flutter/test/widgets/navigator_test.dart
@@ -19,10 +19,11 @@
import 'observer_tester.dart';
import 'route_tester.dart';
import 'semantics_tester.dart';
+import 'test_page_tester.dart';
@pragma('vm:entry-point')
Route<void> _routeBuilder(BuildContext context, Object? arguments) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: const RouteSettings(name: 'route'),
builder: (BuildContext context) => Container(),
);
@@ -89,12 +90,20 @@
@override
Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: Text('Page $id')),
- body: GestureDetector(
- onTap: onTap,
- behavior: HitTestBehavior.opaque,
- child: Center(child: Text(id, style: Theme.of(context).textTheme.displaySmall)),
+ return Semantics(
+ scopesRoute: true,
+ explicitChildNodes: true,
+ child: Column(
+ children: <Widget>[
+ Semantics(header: true, namesRoute: true, child: Text('Page $id')),
+ Expanded(
+ child: GestureDetector(
+ onTap: onTap,
+ behavior: HitTestBehavior.opaque,
+ child: Center(child: Text(id, style: const TextStyle(fontSize: 16))),
+ ),
+ ),
+ ],
),
);
}
@@ -142,7 +151,31 @@
'/second': (BuildContext context) => const SecondWidget(), // Y
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(
+ TestWidgetsApp(
+ routes: routes,
+ pageRouteBuilder: <T>(RouteSettings settings, WidgetBuilder builder) {
+ return PageRouteBuilder<T>(
+ settings: settings,
+ pageBuilder: (context, animation, secondaryAnimation) => builder(context),
+ transitionsBuilder: (context, animation, secondaryAnimation, child) {
+ return Offstage(
+ offstage: animation.value == 0.0,
+ child: SlideTransition(
+ position: animation.drive(
+ Tween<Offset>(
+ begin: const Offset(1.0, 0.0),
+ end: Offset.zero,
+ ).chain(CurveTween(curve: Curves.easeOut)),
+ ),
+ child: child,
+ ),
+ );
+ },
+ );
+ },
+ ),
+ );
expect(find.text('X'), findsOneWidget);
expect(find.text('Y', skipOffstage: false), findsNothing);
@@ -208,12 +241,12 @@
) async {
final nav = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: nav,
- home: const Scaffold(body: Text('home')),
+ home: const Center(child: Text('home')),
),
);
- const page = MaterialPage<void>(child: Text('page'));
+ const page = TestPage<void>(child: Text('page'));
nav.currentState!.push<void>(page.createRoute(nav.currentContext!));
await tester.pumpAndSettle();
expect(find.text('page'), findsOneWidget);
@@ -224,7 +257,7 @@
});
testWidgets('Navigator can set clip behavior', (WidgetTester tester) async {
- const page = MaterialPage<void>(child: Text('page'));
+ const page = TestPage<void>(child: Text('page'));
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData.fromView(tester.view),
@@ -254,7 +287,7 @@
});
testWidgets('Navigator can set clip behavior', (WidgetTester tester) async {
- const page = MaterialPage<void>(child: Text('page'));
+ const page = TestPage<void>(child: Text('page'));
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData.fromView(tester.view),
@@ -298,13 +331,13 @@
);
}
- const page = MaterialPage<void>(key: ValueKey<String>('page'), child: Text('page'));
- const page1 = MaterialPage<void>(key: ValueKey<String>('page1'), child: Text('page1'));
- const page2 = MaterialPage<void>(key: ValueKey<String>('page2'), child: Text('page2'));
- const page3 = MaterialPage<void>(key: ValueKey<String>('page3'), child: Text('page3'));
- const page4 = MaterialPage<void>(key: ValueKey<String>('page4'), child: Text('page4'));
- const page5 = MaterialPage<void>(key: ValueKey<String>('page5'), child: Text('page5'));
- const page6 = MaterialPage<void>(key: ValueKey<String>('page6'), child: Text('page6'));
+ const page = TestPage<void>(key: ValueKey<String>('page'), child: Text('page'));
+ const page1 = TestPage<void>(key: ValueKey<String>('page1'), child: Text('page1'));
+ const page2 = TestPage<void>(key: ValueKey<String>('page2'), child: Text('page2'));
+ const page3 = TestPage<void>(key: ValueKey<String>('page3'), child: Text('page3'));
+ const page4 = TestPage<void>(key: ValueKey<String>('page4'), child: Text('page4'));
+ const page5 = TestPage<void>(key: ValueKey<String>('page5'), child: Text('page5'));
+ const page6 = TestPage<void>(key: ValueKey<String>('page6'), child: Text('page6'));
await buildPages(<Page<void>>[page]);
expect(find.text('page'), findsOneWidget);
@@ -335,10 +368,10 @@
);
}
- const page = MaterialPage<void>(key: ValueKey<String>('page'), child: Text('page'));
- const page1 = MaterialPage<void>(key: ValueKey<String>('page1'), child: Text('page1'));
- const page2 = MaterialPage<void>(key: ValueKey<String>('page2'), child: Text('page2'));
- const page3 = MaterialPage<void>(key: ValueKey<String>('page3'), child: Text('page3'));
+ const page = TestPage<void>(key: ValueKey<String>('page'), child: Text('page'));
+ const page1 = TestPage<void>(key: ValueKey<String>('page1'), child: Text('page1'));
+ const page2 = TestPage<void>(key: ValueKey<String>('page2'), child: Text('page2'));
+ const page3 = TestPage<void>(key: ValueKey<String>('page3'), child: Text('page3'));
await buildPages(<Page<void>>[page]);
expect(find.text('page'), findsOneWidget);
@@ -397,9 +430,9 @@
});
testWidgets('Can push, pop, and replace in sequence', (WidgetTester tester) async {
- const initial = MaterialPage<void>(key: ValueKey<String>('initial'), child: Text('initial'));
- const push = MaterialPage<void>(key: ValueKey<String>('push'), child: Text('push'));
- const replace = MaterialPage<void>(key: ValueKey<String>('replace'), child: Text('replace'));
+ const initial = TestPage<void>(key: ValueKey<String>('initial'), child: Text('initial'));
+ const push = TestPage<void>(key: ValueKey<String>('push'), child: Text('push'));
+ const replace = TestPage<void>(key: ValueKey<String>('replace'), child: Text('replace'));
var pages = <Page<void>>[initial];
bool popPageCallback(Route<dynamic> route, dynamic result) {
pages.removeLast();
@@ -441,50 +474,52 @@
testWidgets('Navigator.of rootNavigator finds root Navigator', (WidgetTester tester) async {
await tester.pumpWidget(
- MaterialApp(
- home: Material(
- child: Column(
- children: <Widget>[
- const SizedBox(height: 300.0, child: Text('Root page')),
- SizedBox(
- height: 300.0,
- child: Navigator(
- onGenerateRoute: (RouteSettings settings) {
- if (settings.name == '/') {
- return MaterialPageRoute<void>(
- builder: (BuildContext context) {
- return ElevatedButton(
- child: const Text('Next'),
+ TestWidgetsApp(
+ home: Column(
+ children: <Widget>[
+ const SizedBox(height: 300.0, child: Text('Root page')),
+ SizedBox(
+ height: 300.0,
+ child: Navigator(
+ onGenerateRoute: (RouteSettings settings) {
+ if (settings.name == '/') {
+ return TestRoute<void>(
+ builder: (BuildContext context) {
+ return Center(
+ child: TestButton(
onPressed: () {
Navigator.of(context).push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
builder: (BuildContext context) {
- return ElevatedButton(
- child: const Text('Inner page'),
- onPressed: () {
- Navigator.of(context, rootNavigator: true).push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) {
- return const Text('Dialog');
- },
- ),
- );
- },
+ return Center(
+ child: TestButton(
+ onPressed: () {
+ Navigator.of(context, rootNavigator: true).push(
+ TestRoute<void>(
+ builder: (BuildContext context) {
+ return const Text('Dialog');
+ },
+ ),
+ );
+ },
+ child: const Text('Inner page'),
+ ),
);
},
),
);
},
- );
- },
- );
- }
- return null;
- },
- ),
+ child: const Text('Next'),
+ ),
+ );
+ },
+ );
+ }
+ return null;
+ },
),
- ],
- ),
+ ),
+ ],
),
),
);
@@ -530,7 +565,7 @@
},
'/second': (BuildContext context) => Container(),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
expect(log, isEmpty);
await tester.tap(find.text('left'));
expect(log, equals(<String>['left']));
@@ -645,7 +680,7 @@
},
'/second': (BuildContext context) => Container(),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
final TestGesture gesture = await tester.startGesture(
tester.getCenter(find.text('right')),
pointer: 23,
@@ -679,7 +714,7 @@
),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
expect(find.text('/'), findsOneWidget);
expect(find.text('A', skipOffstage: false), findsNothing);
expect(find.text('B', skipOffstage: false), findsNothing);
@@ -721,7 +756,7 @@
),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
expect(find.text('/'), findsOneWidget);
expect(find.text('A', skipOffstage: false), findsNothing);
expect(find.text('B', skipOffstage: false), findsNothing);
@@ -770,7 +805,7 @@
};
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
);
expect(find.text('/'), findsOneWidget);
expect(find.text('A'), findsNothing);
@@ -837,13 +872,13 @@
};
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1]),
);
expect(isPushed, isFalse);
expect(isPopped, isFalse);
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1, observer2]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1, observer2]),
);
await tester.tap(find.text('/'));
await tester.pump();
@@ -855,7 +890,7 @@
isPopped = false;
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer1]),
);
await tester.tap(find.text('A'));
await tester.pump();
@@ -884,7 +919,7 @@
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
routes: routes,
initialRoute: '/A/B',
navigatorObservers: <NavigatorObserver>[observer],
@@ -909,14 +944,14 @@
Future<void> createAndDisposeRoute() async {
final nav = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: nav,
- home: const Scaffold(body: Text('home')),
+ home: const Center(child: Text('home')),
),
);
nav.currentState!.push(
- MaterialPageRoute<void>(builder: (_) => const Placeholder()),
+ TestRoute<void>(builder: (_) => const Placeholder()),
); // This should create a route
await tester.pumpAndSettle();
@@ -926,7 +961,7 @@
final events = <ObjectEvent>[];
void listener(ObjectEvent event) {
- if (event.object.runtimeType == MaterialPageRoute<void>) {
+ if (event.object.runtimeType == TestRoute<void>) {
events.add(event);
}
}
@@ -945,8 +980,8 @@
final key = GlobalKey<NavigatorState>();
var called = false;
final pages = <Page<void>>[
- const MaterialPage<void>(child: Text('Page 1')),
- MaterialPage<void>(
+ const TestPage<void>(child: Text('Page 1')),
+ TestPage<void>(
child: PopScope(
onPopInvokedWithResult: (bool didPop, _) {
called = true;
@@ -956,7 +991,7 @@
),
];
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: Navigator(
key: key,
pages: pages,
@@ -977,7 +1012,7 @@
// Regression Test for https://github.com/flutter/flutter/issues/61346.
Widget buildNavigator() {
return Navigator(
- pages: const <Page<void>>[MaterialPage<void>(child: Placeholder())],
+ pages: const <Page<void>>[TestPage<void>(child: Placeholder())],
onPopPage: (Route<dynamic> route, dynamic result) => false,
);
}
@@ -1000,7 +1035,7 @@
});
testWidgets('Page-based route pop before push finishes', (WidgetTester tester) async {
- var pages = <Page<void>>[const MaterialPage<void>(child: Text('Page 1'))];
+ var pages = <Page<void>>[const TestPage<void>(child: Text('Page 1'))];
final navigator = GlobalKey<NavigatorState>();
Widget buildNavigator() {
return Navigator(
@@ -1016,7 +1051,7 @@
await tester.pumpWidget(TestDependencies(child: buildNavigator()));
expect(find.text('Page 1'), findsOneWidget);
pages = pages.toList();
- pages.add(const MaterialPage<void>(child: Text('Page 2')));
+ pages.add(const TestPage<void>(child: Text('Page 2')));
await tester.pumpWidget(TestDependencies(child: buildNavigator()));
// This test should finish without crashing.
@@ -1031,8 +1066,8 @@
testWidgets('Pages update does update overlay correctly', (WidgetTester tester) async {
// Regression Test for https://github.com/flutter/flutter/issues/64941.
var pages = const <Page<void>>[
- MaterialPage<void>(key: ValueKey<int>(0), child: Text('page 0')),
- MaterialPage<void>(key: ValueKey<int>(1), child: Text('page 1')),
+ TestPage<void>(key: ValueKey<int>(0), child: Text('page 0')),
+ TestPage<void>(key: ValueKey<int>(1), child: Text('page 1')),
];
Widget buildNavigator() {
return Navigator(pages: pages, onPopPage: (Route<dynamic> route, dynamic result) => false);
@@ -1044,7 +1079,7 @@
expect(find.text('page 0'), findsNothing);
// Removes the first page.
- pages = const <Page<void>>[MaterialPage<void>(key: ValueKey<int>(1), child: Text('page 1'))];
+ pages = const <Page<void>>[TestPage<void>(key: ValueKey<int>(1), child: Text('page 1'))];
await tester.pumpWidget(TestDependencies(child: buildNavigator()));
// Overlay updates correctly.
@@ -1073,7 +1108,7 @@
'/B': (BuildContext context) => const OnTapPage(id: 'B'),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
await tester.tap(find.text('/')); // replaceNamed('/A')
await tester.pump();
await tester.pump(const Duration(seconds: 1));
@@ -1119,7 +1154,7 @@
),
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
final ret = SlideInOutPageRoute<dynamic>(
bodyBuilder: builders[settings.name]!,
@@ -1178,7 +1213,7 @@
),
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
final ret = SlideInOutPageRoute<dynamic>(
bodyBuilder: builders[settings.name]!,
@@ -1224,7 +1259,7 @@
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
return SlideInOutPageRoute<dynamic>(bodyBuilder: routes[settings.name]!);
},
@@ -1294,7 +1329,7 @@
);
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
routes: routes,
navigatorObservers: <NavigatorObserver>[observer],
initialRoute: '/A/B',
@@ -1334,7 +1369,7 @@
},
),
};
- await tester.pumpWidget(MaterialApp(routes: routes, initialRoute: '/A/B'));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes, initialRoute: '/A/B'));
await tester.tap(find.text('B'));
await tester.pumpAndSettle();
expect(tester.takeException(), isNull);
@@ -1347,14 +1382,14 @@
bool? secondReturnValue;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
final String? routeName = settings.name;
switch (routeName) {
case '/':
- return MaterialPageRoute<bool>(
+ return TestRoute<bool>(
builder: (BuildContext context) => OnTapPage(
id: '/',
onTap: () async {
@@ -1364,7 +1399,7 @@
settings: settings,
);
case '/A':
- return MaterialPageRoute<bool>(
+ return TestRoute<bool>(
builder: (BuildContext context) => OnTapPage(
id: 'A',
onTap: () async {
@@ -1374,7 +1409,7 @@
settings: settings,
);
case '/B':
- return MaterialPageRoute<bool>(
+ return TestRoute<bool>(
builder: (BuildContext context) => OnTapPage(
id: 'B',
onTap: () async {
@@ -1500,7 +1535,7 @@
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
return SlideInOutPageRoute<dynamic>(bodyBuilder: routes[settings.name]!);
},
@@ -1556,7 +1591,7 @@
};
await tester.pumpWidget(
- MaterialApp(navigatorKey: navigator, routes: routes, initialRoute: '/A/B'),
+ TestWidgetsApp(navigatorKey: navigator, routes: routes, initialRoute: '/A/B'),
);
await tester.pumpAndSettle();
await tester.tap(find.text('B'));
@@ -1598,7 +1633,7 @@
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
return PageRouteBuilder<String>(
settings: settings,
@@ -1667,7 +1702,7 @@
};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorObservers: <NavigatorObserver>[observer],
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
@@ -1756,7 +1791,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -1807,7 +1842,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -1846,7 +1881,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -1864,9 +1899,7 @@
final NavigatorState navigator = tester.state<NavigatorState>(find.byType(Navigator));
- final routeB = MaterialPageRoute<void>(
- builder: (BuildContext context) => const OnTapPage(id: '/B'),
- );
+ final routeB = TestRoute<void>(builder: (BuildContext context) => const OnTapPage(id: '/B'));
navigator.replace(
oldRoute: routes['/A']!,
newRoute: routeB,
@@ -1888,7 +1921,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -1906,9 +1939,7 @@
final NavigatorState navigator = tester.state<NavigatorState>(find.byType(Navigator));
- final routeB = MaterialPageRoute<void>(
- builder: (BuildContext context) => const OnTapPage(id: '/B'),
- );
+ final routeB = TestRoute<void>(builder: (BuildContext context) => const OnTapPage(id: '/B'));
navigator.replace(
oldRoute: routes['/A']!,
newRoute: routeB,
@@ -1932,7 +1963,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -1981,7 +2012,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -2031,7 +2062,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -2050,9 +2081,7 @@
final NavigatorState navigator = tester.state<NavigatorState>(find.byType(Navigator));
- final routeC = MaterialPageRoute<void>(
- builder: (BuildContext context) => const OnTapPage(id: '/C'),
- );
+ final routeC = TestRoute<void>(builder: (BuildContext context) => const OnTapPage(id: '/C'));
navigator.pushAndRemoveUntil(
routeC,
ModalRoute.withName('/'),
@@ -2085,7 +2114,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -2135,7 +2164,7 @@
final routes = <String, Route<String>>{};
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
routes[settings.name!] = PageRouteBuilder<String>(
settings: settings,
@@ -2186,29 +2215,29 @@
};
late Route<void> routeB;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: key,
navigatorObservers: <NavigatorObserver>[observer],
- home: TextButton(
+ home: TestButton(
child: const Text('A'),
onPressed: () {
key.currentState!.push<void>(
- routeB = MaterialPageRoute<void>(
+ routeB = TestRoute<void>(
settings: const RouteSettings(name: 'B'),
builder: (BuildContext context) {
- return TextButton(
+ return TestButton(
child: const Text('B'),
onPressed: () {
key.currentState!.push<void>(
- MaterialPageRoute<int>(
+ TestRoute<int>(
settings: const RouteSettings(name: 'C'),
builder: (BuildContext context) {
- return TextButton(
+ return TestButton(
child: const Text('C'),
onPressed: () {
key.currentState!.replace(
oldRoute: routeB,
- newRoute: MaterialPageRoute<int>(
+ newRoute: TestRoute<int>(
settings: const RouteSettings(name: 'D'),
builder: (BuildContext context) {
return const Text('D');
@@ -2278,7 +2307,7 @@
};
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
);
await tester.tap(find.text('/'));
@@ -2300,39 +2329,33 @@
final log = <String>[];
late Route<void> routeB;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: key,
- theme: ThemeData(
- pageTransitionsTheme: const PageTransitionsTheme(
- builders: <TargetPlatform, PageTransitionsBuilder>{
- TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
- },
- ),
- ),
- home: TextButton(
+ home: TestButton(
child: const Text('A'),
onPressed: () {
key.currentState!.push<void>(
- routeB = MaterialPageRoute<void>(
+ routeB = TestRoute<void>(
settings: const RouteSettings(name: 'B'),
builder: (BuildContext context) {
log.add('building B');
- return TextButton(
+ return TestButton(
child: const Text('B'),
onPressed: () {
key.currentState!.push<void>(
- MaterialPageRoute<int>(
+ TestRoute<int>(
settings: const RouteSettings(name: 'C'),
builder: (BuildContext context) {
log.add('building C');
log.add('found ${ModalRoute.settingsOf(context)!.name}');
- return TextButton(
+ return TestButton(
child: const Text('C'),
onPressed: () {
key.currentState!.replace(
oldRoute: routeB,
- newRoute: MaterialPageRoute<int>(
+ newRoute: TestRoute<int>(
settings: const RouteSettings(name: 'D'),
+ maintainState: true,
builder: (BuildContext context) {
log.add('building D');
return const Text('D');
@@ -2385,7 +2408,7 @@
},
);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: key,
onGenerateRoute: (RouteSettings settings) {
assert(nextRoute != null);
@@ -2455,7 +2478,7 @@
},
);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: key,
onGenerateRoute: (RouteSettings settings) {
assert(nextRoute != null);
@@ -2535,7 +2558,7 @@
'/B/C': (BuildContext context) => const OnTapPage(id: '3'),
};
- await tester.pumpWidget(MaterialApp(routes: routes));
+ await tester.pumpWidget(TestWidgetsApp(routes: routes));
expect(semantics, includesNodeWith(flags: <SemanticsFlag>[SemanticsFlag.scopesRoute]));
expect(
@@ -2580,10 +2603,10 @@
final arguments = <Object?>[];
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
onGenerateRoute: (RouteSettings settings) {
arguments.add(settings.arguments);
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
builder: (BuildContext context) =>
Center(key: currentRouteKey = GlobalKey(), child: Text(settings.name!)),
@@ -2649,11 +2672,11 @@
final arguments = <Object?>[];
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: navigatorKey,
onGenerateRoute: (RouteSettings settings) {
arguments.add(settings.arguments);
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
builder: (BuildContext context) => Center(child: Text(settings.name!)),
);
@@ -2715,7 +2738,7 @@
const keyABC = Key('ABC');
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: keyNav,
initialRoute: '/A/B/C',
routes: <String, WidgetBuilder>{
@@ -2746,7 +2769,7 @@
const keyAB = Key('AB');
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: keyNav,
initialRoute: '/A/B/C',
routes: <String, WidgetBuilder>{
@@ -2800,7 +2823,7 @@
};
await tester.pumpWidget(
- MaterialApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
+ TestWidgetsApp(routes: routes, navigatorObservers: <NavigatorObserver>[observer]),
);
expect(find.text('/'), findsOneWidget);
expect(find.text('A'), findsNothing);
@@ -2888,7 +2911,7 @@
final Key intermediate = UniqueKey();
final GlobalKey topmost = GlobalKey();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
initialRoute: '/A/B',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => Container(key: root),
@@ -2912,7 +2935,7 @@
final navigator = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: navigator,
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
@@ -2941,7 +2964,7 @@
final navigator = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: navigator,
initialRoute: '/A/B',
onGenerateRoute: (RouteSettings settings) {
@@ -2988,14 +3011,7 @@
final Key bottomRoute = UniqueKey();
final Key topRoute = UniqueKey();
await tester.pumpWidget(
- MaterialApp(
- theme: ThemeData(
- pageTransitionsTheme: const PageTransitionsTheme(
- builders: <TargetPlatform, PageTransitionsBuilder>{
- TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
- },
- ),
- ),
+ TestWidgetsApp(
navigatorKey: navigator,
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => StatefulTestWidget(key: bottomRoute),
@@ -3026,7 +3042,8 @@
key: testKey,
initialRoute: '/a/b',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
+ maintainState: true,
builder: (BuildContext c) {
return Text('+${s.name}+');
},
@@ -3072,7 +3089,7 @@
final result = <Route<void>>[];
for (final String route in initialRoute.split(' ')) {
result.add(
- MaterialPageRoute<void>(
+ TestRoute<void>(
builder: (BuildContext context) {
return Text(route);
},
@@ -3100,7 +3117,7 @@
WidgetTester tester,
) async {
final testKey = GlobalKey<NavigatorState>();
- await tester.pumpWidget(MaterialApp(navigatorKey: testKey, home: const Text('home')));
+ await tester.pumpWidget(TestWidgetsApp(navigatorKey: testKey, home: const Text('home')));
final NavigatorState state = Navigator.of(testKey.currentContext!);
expect(state, testKey.currentState);
@@ -3112,12 +3129,12 @@
final root = GlobalKey<NavigatorState>();
final sub = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: root,
home: Navigator(
key: sub,
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
builder: (BuildContext context) => const Text('dummy'),
);
@@ -3151,7 +3168,7 @@
WidgetTester tester,
) async {
final testKey = GlobalKey<NavigatorState>();
- await tester.pumpWidget(MaterialApp(navigatorKey: testKey, home: const Text('home')));
+ await tester.pumpWidget(TestWidgetsApp(navigatorKey: testKey, home: const Text('home')));
final NavigatorState? state = Navigator.maybeOf(testKey.currentContext!);
expect(state, isNotNull);
@@ -3164,12 +3181,12 @@
final root = GlobalKey<NavigatorState>();
final sub = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: root,
home: Navigator(
key: sub,
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
builder: (BuildContext context) => const Text('dummy'),
);
@@ -3189,7 +3206,7 @@
final navigator = GlobalKey<NavigatorState>();
final observer = TransitionDurationObserver();
- final routeNameToContext = <String, MaterialPageRoute<dynamic>>{};
+ final routeNameToContext = <String, TestRoute<Object?>>{};
await tester.pumpWidget(
TestDependencies(
@@ -3198,11 +3215,12 @@
observers: <NavigatorObserver>[observer],
initialRoute: 'root',
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
+ maintainState: true,
+ transitionDuration: const Duration(milliseconds: 300),
builder: (BuildContext context) {
- routeNameToContext[settings.name!] =
- ModalRoute.of(context)! as MaterialPageRoute<dynamic>;
+ routeNameToContext[settings.name!] = ModalRoute.of(context)! as TestRoute<Object?>;
return Text('Route: ${settings.name}');
},
);
@@ -3278,7 +3296,7 @@
child: Navigator(
initialRoute: 'root',
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
settings: settings,
builder: (BuildContext context) {
return _TickingWidget(
@@ -3327,7 +3345,7 @@
final navigator = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: navigator,
initialRoute: '/second',
onGenerateRoute: (RouteSettings settings) {
@@ -3389,13 +3407,13 @@
key: top,
initialRoute: 'top1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return Navigator(
key: sub,
initialRoute: 'sub1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3417,7 +3435,7 @@
expect(observations[0].previous, isNull);
sub.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
settings: const RouteSettings(name: 'sub2'),
builder: (BuildContext context) => const Text('sub2'),
),
@@ -3429,7 +3447,7 @@
expect(observations.length, 1);
top.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
settings: const RouteSettings(name: 'top2'),
builder: (BuildContext context) => const Text('top2'),
),
@@ -3467,7 +3485,7 @@
key: key1,
initialRoute: 'navigator1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3487,7 +3505,7 @@
key: key2,
initialRoute: 'navigator2',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3501,7 +3519,7 @@
observations.clear();
key2.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
settings: const RouteSettings(name: 'new route'),
builder: (BuildContext context) => const Text('new route'),
),
@@ -3556,7 +3574,7 @@
key: key1,
initialRoute: 'navigator1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3571,7 +3589,7 @@
key: key2,
initialRoute: 'navigator2',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3602,7 +3620,7 @@
key: key1,
initialRoute: 'navigator1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3617,7 +3635,7 @@
key: key2,
initialRoute: 'navigator2',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3633,7 +3651,7 @@
// Pushes a route to navigator2.
key2.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
settings: const RouteSettings(name: 'new route2'),
builder: (BuildContext context) => const Text('new route2'),
),
@@ -3649,7 +3667,7 @@
// Pushes a route to navigator1
key1.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
settings: const RouteSettings(name: 'new route1'),
builder: (BuildContext context) => const Text('new route1'),
),
@@ -3679,7 +3697,7 @@
Navigator(
initialRoute: 'navigator1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3690,7 +3708,7 @@
Navigator(
initialRoute: 'navigator2',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3719,7 +3737,7 @@
Navigator(
initialRoute: 'navigator1',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3730,7 +3748,7 @@
Navigator(
initialRoute: 'navigator2',
onGenerateRoute: (RouteSettings s) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext c) {
return const Placeholder();
},
@@ -3775,10 +3793,7 @@
data: MediaQueryData.fromView(view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
- DefaultWidgetsLocalizations.delegate,
- ],
+ delegates: const <LocalizationsDelegate<dynamic>>[DefaultWidgetsLocalizations.delegate],
child: TestDependencies(
child: Navigator(
key: key,
@@ -3794,10 +3809,10 @@
testWidgets('can initialize with pages list', (WidgetTester tester) async {
final navigator = GlobalKey<NavigatorState>();
- final myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ final myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
@@ -3830,8 +3845,12 @@
) async {
// Regression test for https://github.com/flutter/flutter/issues/97363.
final navigator = GlobalKey<NavigatorState>();
- final myPages1 = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
- final myPages2 = <TestPage>[const TestPage(key: ValueKey<String>('2'), name: 'second')];
+ final myPages1 = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
+ final myPages2 = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ ];
bool onPopPage(Route<dynamic> route, dynamic result) => false;
@@ -3860,10 +3879,10 @@
});
testWidgets('throw if onPopPage callback is not provided', (WidgetTester tester) async {
- final myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ final myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
await tester.pumpWidget(
@@ -3871,10 +3890,7 @@
data: MediaQueryData.fromView(tester.view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
- DefaultWidgetsLocalizations.delegate,
- ],
+ delegates: const <LocalizationsDelegate<Object?>>[DefaultWidgetsLocalizations.delegate],
child: TestDependencies(child: Navigator(pages: myPages)),
),
),
@@ -3898,7 +3914,7 @@
experimentalLeakTesting: LeakTesting.settings
.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
- final myPages = <TestPage>[];
+ final myPages = <TestPage<Object?>>[];
final FlutterExceptionHandler? originalOnError = FlutterError.onError;
FlutterErrorDetails? firstError;
FlutterError.onError = (FlutterErrorDetails? detail) {
@@ -3910,8 +3926,7 @@
data: MediaQueryData.fromView(tester.view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
+ delegates: const <LocalizationsDelegate<Object?>>[
DefaultWidgetsLocalizations.delegate,
],
child: TestDependencies(child: Navigator(pages: myPages)),
@@ -3930,18 +3945,15 @@
WidgetTester tester,
) async {
var myPages = const <Page<void>>[
- MaterialPage<void>(child: Text('page1')),
- MaterialPage<void>(child: Text('page2')),
+ TestPage<void>(child: Text('page1')),
+ TestPage<void>(child: Text('page2')),
];
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData.fromView(tester.view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
- DefaultWidgetsLocalizations.delegate,
- ],
+ delegates: const <LocalizationsDelegate<Object?>>[DefaultWidgetsLocalizations.delegate],
child: Navigator(pages: myPages, onPopPage: (_, _) => false),
),
),
@@ -3952,17 +3964,14 @@
route.addLocalHistoryEntry(LocalHistoryEntry(onRemove: () => entryRemoved = true));
expect(route.willHandlePopInternally, true);
- myPages = const <Page<void>>[MaterialPage<void>(child: Text('page1'))];
+ myPages = const <Page<void>>[TestPage<void>(child: Text('page1'))];
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData.fromView(tester.view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
- DefaultWidgetsLocalizations.delegate,
- ],
+ delegates: const <LocalizationsDelegate<Object?>>[DefaultWidgetsLocalizations.delegate],
child: Navigator(pages: myPages, onPopPage: (_, _) => false),
),
),
@@ -3975,18 +3984,15 @@
WidgetTester tester,
) async {
const myPages = <Page<void>>[
- MaterialPage<void>(child: Text('page1')),
- MaterialPage<void>(child: PopScope<void>(canPop: false, child: Text('page2'))),
+ TestPage<void>(child: Text('page1')),
+ TestPage<void>(child: PopScope<void>(canPop: false, child: Text('page2'))),
];
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData.fromView(tester.view),
child: Localizations(
locale: const Locale('en', 'US'),
- delegates: const <LocalizationsDelegate<dynamic>>[
- DefaultMaterialLocalizations.delegate,
- DefaultWidgetsLocalizations.delegate,
- ],
+ delegates: const <LocalizationsDelegate<Object?>>[DefaultWidgetsLocalizations.delegate],
child: Navigator(pages: myPages, onPopPage: (_, _) => false),
),
),
@@ -4262,7 +4268,7 @@
WidgetTester tester,
) async {
// Regression Test for https://github.com/flutter/flutter/issues/156033.
- var pages = <Page<Object?>>[MaterialPage<void>(key: UniqueKey(), child: const Text('home'))];
+ var pages = <Page<Object?>>[TestPage<void>(key: UniqueKey(), child: const Text('home'))];
final key = GlobalKey<NavigatorState>();
Widget buildNavigator() {
return TestDependencies(
@@ -4275,8 +4281,8 @@
pages = <Page<Object?>>[
...pages,
- MaterialPage<void>(key: UniqueKey(), child: const Text('child1')),
- MaterialPage<void>(key: UniqueKey(), child: const Text('child2')),
+ TestPage<void>(key: UniqueKey(), child: const Text('child1')),
+ TestPage<void>(key: UniqueKey(), child: const Text('child2')),
];
await tester.pumpWidget(buildNavigator());
@@ -4308,9 +4314,9 @@
testWidgets('can work with pageless route', (WidgetTester tester) async {
final navigator = GlobalKey<NavigatorState>();
- var myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ var myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
@@ -4325,10 +4331,10 @@
expect(find.text('initial'), findsNothing);
// Pushes two pageless routes to second page route
navigator.currentState!.push(
- MaterialPageRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
);
navigator.currentState!.push(
- MaterialPageRoute<void>(builder: (BuildContext context) => const Text('second-pageless2')),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless2')),
);
await tester.pumpAndSettle();
// Now the history should look like
@@ -4338,10 +4344,10 @@
expect(find.text('second-pageless1'), findsNothing);
expect(find.text('second-pageless2'), findsOneWidget);
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4355,7 +4361,7 @@
// Pushes one pageless routes to third page route
navigator.currentState!.push(
- MaterialPageRoute<void>(builder: (BuildContext context) => const Text('third-pageless1')),
+ TestRoute<void>(builder: (BuildContext context) => const Text('third-pageless1')),
);
await tester.pumpAndSettle();
// Now the history should look like
@@ -4367,10 +4373,10 @@
expect(find.text('third'), findsNothing);
expect(find.text('third-pageless1'), findsOneWidget);
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4435,7 +4441,9 @@
testWidgets('complex case 1', (WidgetTester tester) async {
final navigator = GlobalKey<NavigatorState>();
- var myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ var myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
bool onPopPage(Route<dynamic> route, dynamic result) {
myPages.removeWhere((Page<dynamic> page) => route.settings == page);
return route.didPop(result);
@@ -4449,18 +4457,16 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('initial-pageless1'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('initial-pageless1')),
)
.then((_) => initialPageless1Completed = true),
);
await tester.pumpAndSettle();
// Pushes second page route with two pageless routes.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4470,9 +4476,7 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('second-pageless1'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
)
.then((_) => secondPageless1Completed = true),
);
@@ -4481,19 +4485,17 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('second-pageless2'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless2')),
)
.then((_) => secondPageless2Completed = true),
);
await tester.pumpAndSettle();
// Pushes third page route with one pageless route.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4502,11 +4504,7 @@
var thirdPageless1Completed = false;
unawaited(
navigator.currentState!
- .push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('third-pageless1'),
- ),
- )
+ .push(TestRoute<void>(builder: (BuildContext context) => const Text('third-pageless1')))
.then((_) => thirdPageless1Completed = true),
);
await tester.pumpAndSettle();
@@ -4518,9 +4516,9 @@
expect(thirdPageless1Completed, false);
// Switches order and removes the initial page route.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4531,7 +4529,9 @@
expect(secondPageless2Completed, false);
expect(thirdPageless1Completed, false);
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('3'), name: 'third')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
@@ -4540,7 +4540,9 @@
expect(secondPageless2Completed, true);
expect(thirdPageless1Completed, false);
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('4'), name: 'forth')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('4'), name: 'forth', child: Text('forth')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
@@ -4552,9 +4554,9 @@
//Regression test for https://github.com/flutter/flutter/issues/115887
testWidgets('Complex case 2', (WidgetTester tester) async {
final navigator = GlobalKey<NavigatorState>();
- var myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ var myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
@@ -4569,7 +4571,7 @@
expect(find.text('initial'), findsNothing);
// Push pageless route to second page route
navigator.currentState!.push(
- MaterialPageRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
);
await tester.pumpAndSettle();
@@ -4579,7 +4581,9 @@
expect(find.text('second-pageless1'), findsOneWidget);
expect(myPages.length, 2);
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('2'), name: 'second')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
@@ -4605,7 +4609,9 @@
) async {
final navigator = GlobalKey<NavigatorState>();
final transitionDelegate = AlwaysRemoveTransitionDelegate();
- var myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ var myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
bool onPopPage(Route<dynamic> route, dynamic result) {
myPages.removeWhere((Page<dynamic> page) => route.settings == page);
return route.didPop(result);
@@ -4625,18 +4631,16 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('initial-pageless1'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('initial-pageless1')),
)
.then((_) => initialPageless1Completed = true),
);
await tester.pumpAndSettle();
// Pushes second page route with two pageless routes.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(
@@ -4651,9 +4655,7 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('second-pageless1'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless1')),
)
.then((_) => secondPageless1Completed = true),
);
@@ -4662,19 +4664,17 @@
unawaited(
navigator.currentState!
.push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('second-pageless2'),
- ),
+ TestRoute<void>(builder: (BuildContext context) => const Text('second-pageless2')),
)
.then((_) => secondPageless2Completed = true),
);
await tester.pumpAndSettle();
// Pushes third page route with one pageless route.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
await tester.pumpWidget(
buildNavigator(
@@ -4688,11 +4688,7 @@
var thirdPageless1Completed = false;
unawaited(
navigator.currentState!
- .push(
- MaterialPageRoute<void>(
- builder: (BuildContext context) => const Text('third-pageless1'),
- ),
- )
+ .push(TestRoute<void>(builder: (BuildContext context) => const Text('third-pageless1')))
.then((_) => thirdPageless1Completed = true),
);
await tester.pumpAndSettle();
@@ -4704,9 +4700,9 @@
expect(thirdPageless1Completed, false);
// Switches order and removes the initial page route.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(
@@ -4723,7 +4719,9 @@
expect(secondPageless2Completed, false);
expect(thirdPageless1Completed, false);
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('3'), name: 'third')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
+ ];
await tester.pumpWidget(
buildNavigator(
view: tester.view,
@@ -4739,7 +4737,9 @@
expect(secondPageless2Completed, true);
expect(thirdPageless1Completed, false);
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('4'), name: 'forth')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('4'), name: 'forth', child: Text('forth')),
+ ];
await tester.pumpWidget(
buildNavigator(
view: tester.view,
@@ -4761,9 +4761,9 @@
WidgetTester tester,
) async {
final navigator = GlobalKey<NavigatorState>();
- List<Page<dynamic>> myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ List<Page<Object?>> myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
myPages.removeWhere((Page<dynamic> page) => route.settings == page);
@@ -4775,15 +4775,17 @@
);
// Pops the second page route.
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
// Re-push the second page again before it finishes popping.
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
@@ -4799,9 +4801,9 @@
WidgetTester tester,
) async {
final navigator = GlobalKey<NavigatorState>();
- List<Page<dynamic>> myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ List<Page<Object?>> myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
myPages.removeWhere((Page<dynamic> page) => route.settings == page);
@@ -4813,13 +4815,17 @@
);
// Pops the second page route.
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
// Updates the pages again before second page finishes popping.
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
@@ -4835,9 +4841,9 @@
) async {
// Regression test for https://github.com/flutter/flutter/issues/68162.
final navigator = GlobalKey<NavigatorState>();
- List<Page<dynamic>> myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'initial'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
+ List<Page<Object?>> myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
];
bool onPopPage(Route<dynamic> route, dynamic result) {
myPages.removeWhere((Page<dynamic> page) => route.settings == page);
@@ -4848,17 +4854,19 @@
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
// Pushes a pageless route.
- final Future<void> dialog = showDialog<void>(
+ final Future<void> dialog = showGeneralDialog<void>(
useRootNavigator: false,
context: navigator.currentContext!,
- builder: (BuildContext context) => const Text('dialog'),
+ pageBuilder: (_, _, _) => const Text('dialog'),
);
await tester.pumpAndSettle();
expect(find.text('dialog'), findsOneWidget);
// Pops the pageless route.
navigator.currentState!.pop();
// Before the pop finishes, updates the page list.
- myPages = <TestPage>[const TestPage(key: ValueKey<String>('1'), name: 'initial')];
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'initial', child: Text('initial')),
+ ];
await tester.pumpWidget(
buildNavigator(view: tester.view, pages: myPages, onPopPage: onPopPage, key: navigator),
);
@@ -4873,10 +4881,10 @@
WidgetTester tester,
) async {
final navigator = GlobalKey<NavigatorState>();
- var myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('1'), name: 'first'),
- const TestPage(key: ValueKey<String>('2'), name: 'second'),
- const TestPage(key: ValueKey<String>('3'), name: 'third'),
+ var myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('1'), name: 'first', child: Text('first')),
+ const TestPage(key: ValueKey<String>('2'), name: 'second', child: Text('second')),
+ const TestPage(key: ValueKey<String>('3'), name: 'third', child: Text('third')),
];
final observations = <NavigatorObservation>[];
final observer = TestObserver()
@@ -4909,9 +4917,9 @@
observers: <NavigatorObserver>[observer],
),
);
- myPages = <TestPage>[
- const TestPage(key: ValueKey<String>('4'), name: 'forth'),
- const TestPage(key: ValueKey<String>('5'), name: 'fifth'),
+ myPages = <TestPage<Object?>>[
+ const TestPage(key: ValueKey<String>('4'), name: 'forth', child: Text('forth')),
+ const TestPage(key: ValueKey<String>('5'), name: 'fifth', child: Text('fifth')),
];
await tester.pumpWidget(
@@ -5012,7 +5020,7 @@
children: <Widget>[
FocusScope(node: focusNode, child: Container()),
Expanded(
- child: MaterialApp(
+ child: TestWidgetsApp(
home: Navigator(
key: navigatorKey,
onGenerateRoute: (RouteSettings settings) {
@@ -5086,7 +5094,7 @@
children: <Widget>[
FocusScope(node: focusNode, child: Container()),
Expanded(
- child: MaterialApp(
+ child: TestWidgetsApp(
home: Navigator(
key: navigatorKey,
onGenerateRoute: (RouteSettings settings) {
@@ -5228,14 +5236,13 @@
);
final Key openSheetKey = UniqueKey();
await tester.pumpWidget(
- MaterialApp(
- theme: ThemeData(primarySwatch: Colors.blue),
+ TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
@@ -5243,28 +5250,28 @@
),
],
),
- '/one': (BuildContext context) => Scaffold(
- body: Column(
+ '/one': (BuildContext context) => SizedBox.expand(
+ child: Column(
children: <Widget>[
const TestListTile(title: Text('Title 1')),
const TestListTile(title: Text('Title 2')),
const TestListTile(title: Text('Title 3')),
- ElevatedButton(
+ TestButton(
key: openSheetKey,
onPressed: () {
- showModalBottomSheet<void>(
+ showGeneralDialog<void>(
context: context,
- builder: (BuildContext context) {
+ pageBuilder: (BuildContext context, _, _) {
return Center(
- child: ElevatedButton(
+ child: TestButton(
onPressed: () => Navigator.pop(context),
- child: const Text('Close Sheet'),
+ child: const Text('Close Dialog'),
),
);
},
);
},
- child: const Text('Open Sheet'),
+ child: const Text('Open Dialog'),
),
],
),
@@ -5278,7 +5285,7 @@
await tester.tap(find.text('Go to one'));
await tester.pumpAndSettle();
- // The focused node before opening the sheet.
+ // The focused node before opening the dialog.
final ByteData? fakeMessage = SystemChannels.accessibility.codec.encodeMessage(
<String, dynamic>{'type': 'didGainFocus', 'nodeId': 5},
);
@@ -5289,13 +5296,13 @@
);
await tester.pumpAndSettle();
- await tester.tap(find.text('Open Sheet'));
+ await tester.tap(find.text('Open Dialog'));
await tester.pumpAndSettle();
- expect(find.text('Close Sheet'), findsOneWidget);
- await tester.tap(find.text('Close Sheet'));
+ expect(find.text('Close Dialog'), findsOneWidget);
+ await tester.tap(find.text('Close Dialog'));
await tester.pumpAndSettle(const Duration(milliseconds: 500));
- // The focused node before opening the sheet regains the focus;
+ // The focused node before opening the dialog regains the focus;
expect(semanticEvent, <String, dynamic>{
'type': 'focus',
'nodeId': 5,
@@ -5352,7 +5359,7 @@
testWidgets(
'a single route is already defaulted to false',
(WidgetTester tester) async {
- await tester.pumpWidget(const MaterialApp(home: Scaffold(body: Text('home'))));
+ await tester.pumpWidget(const TestWidgetsApp(home: Center(child: Text('home'))));
expect(lastFrameworkHandlesBack, isFalse);
},
@@ -5364,13 +5371,13 @@
'navigating around a single Navigator with .pop',
(WidgetTester tester) async {
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
@@ -5381,7 +5388,7 @@
'/one': (BuildContext context) => _LinksPage(
title: 'Page one',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one/one');
},
@@ -5441,13 +5448,13 @@
'navigating around a single Navigator with system back',
(WidgetTester tester) async {
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
@@ -5458,7 +5465,7 @@
'/one': (BuildContext context) => _LinksPage(
title: 'Page one',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one/one');
},
@@ -5523,7 +5530,7 @@
StatefulBuilder(
builder: (BuildContext context, StateSetter setter) {
setState = setter;
- return MaterialApp(
+ return TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(title: 'Home page', canPop: canPop),
@@ -5562,7 +5569,7 @@
StatefulBuilder(
builder: (BuildContext context, StateSetter setter) {
setState = setter;
- return MaterialApp(
+ return TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(title: 'Home page', canPop: canPop),
@@ -5614,20 +5621,20 @@
}
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: nav,
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
child: const Text('Go to one'),
),
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/nested');
},
@@ -5638,7 +5645,7 @@
'/one': (BuildContext context) => _LinksPage(
title: 'Page one',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one/one');
},
@@ -5704,19 +5711,19 @@
StatefulBuilder(
builder: (BuildContext context, StateSetter setter) {
setState = setter;
- return MaterialApp(
+ return TestWidgetsApp(
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
child: const Text('Go to one'),
),
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/nested');
},
@@ -5727,7 +5734,7 @@
'/one': (BuildContext context) => _LinksPage(
title: 'Page one',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one/one');
},
@@ -5831,7 +5838,7 @@
bool canPop() => pages.length <= 1;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
builderSetState = setState;
@@ -5858,11 +5865,11 @@
pages: pages.map((_Page page) {
switch (page) {
case _Page.home:
- return MaterialPage<void>(
+ return TestPage<void>(
child: _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_Page.one);
@@ -5870,7 +5877,7 @@
},
child: const Text('Go to _Page.one'),
),
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_Page.noPop);
@@ -5882,9 +5889,9 @@
),
);
case _Page.one:
- return const MaterialPage<void>(child: _LinksPage(title: 'Page one'));
+ return const TestPage<void>(child: _LinksPage(title: 'Page one'));
case _Page.noPop:
- return const MaterialPage<void>(
+ return const TestPage<void>(
child: _LinksPage(title: 'Cannot pop page', canPop: false),
);
}
@@ -5943,7 +5950,7 @@
bool canPop() => pages.length <= 1;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return PopScope<Object?>(
@@ -5969,11 +5976,11 @@
pages: pages.map((_Page page) {
switch (page) {
case _Page.home:
- return MaterialPage<void>(
+ return TestPage<void>(
child: _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_Page.one);
@@ -5981,7 +5988,7 @@
},
child: const Text('Go to _Page.one'),
),
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_Page.noPop);
@@ -5993,9 +6000,9 @@
),
);
case _Page.one:
- return const MaterialPage<void>(child: _LinksPage(title: 'Page one'));
+ return const TestPage<void>(child: _LinksPage(title: 'Page one'));
case _Page.noPop:
- return const MaterialPage<void>(
+ return const TestPage<void>(
child: _LinksPage(title: 'Cannot pop page', canPop: false),
);
}
@@ -6031,7 +6038,7 @@
var onPopInvokedCallCount = 0;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return PopScope<Object?>(
@@ -6057,11 +6064,11 @@
pages: pages.map((_PageWithYesPop page) {
switch (page) {
case _PageWithYesPop.home:
- return MaterialPage<void>(
+ return TestPage<void>(
child: _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_PageWithYesPop.one);
@@ -6069,7 +6076,7 @@
},
child: const Text('Go to _PageWithYesPop.one'),
),
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_PageWithYesPop.noPop);
@@ -6077,7 +6084,7 @@
},
child: const Text('Go to _PageWithYesPop.noPop'),
),
- TextButton(
+ TestButton(
onPressed: () {
setState(() {
pages.add(_PageWithYesPop.yesPop);
@@ -6089,13 +6096,13 @@
),
);
case _PageWithYesPop.one:
- return const MaterialPage<void>(child: _LinksPage(title: 'Page one'));
+ return const TestPage<void>(child: _LinksPage(title: 'Page one'));
case _PageWithYesPop.noPop:
- return const MaterialPage<void>(
+ return const TestPage<void>(
child: _LinksPage(title: 'Cannot pop page', canPop: false),
);
case _PageWithYesPop.yesPop:
- return MaterialPage<void>(
+ return TestPage<void>(
child: _LinksPage(
title: 'Can pop page',
canPop: true,
@@ -6160,7 +6167,7 @@
final pages = <Page<Object?>>[page1, page2, page3];
final key = GlobalKey<NavigatorState>();
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: Navigator(
key: key,
pages: pages,
@@ -6212,20 +6219,20 @@
const result = 'i am a result';
final List<String?> results = <String>[];
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
navigatorKey: nav,
initialRoute: '/',
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _LinksPage(
title: 'Home page',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
child: const Text('Go to one'),
),
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/nested');
},
@@ -6236,7 +6243,7 @@
'/one': (BuildContext context) => _LinksPage(
title: 'Page one',
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one/one');
},
@@ -6305,7 +6312,7 @@
Navigator(
key: navigatorKey,
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext context) {
return const Center(child: Text('home'));
},
@@ -6329,21 +6336,21 @@
child: home,
);
}
- await tester.pumpWidget(MaterialApp(home: home));
+ await tester.pumpWidget(TestWidgetsApp(home: home));
}
/// Layout is:
- /// ---------MaterialApp---------
+ /// ---------WidgetsApp---------
/// [0]
/// ---------Nested Navigator---------
/// [1]
/// [2]
/// ---------Nested Navigator End---------
/// [3]
- /// ---------MaterialApp End---------
+ /// ---------WidgetsApp End---------
void pushWith(TraversalEdgeBehavior behavior) {
navigatorKey.currentState!.push(
- MaterialPageRoute<void>(
+ TestRoute<void>(
directionalTraversalEdgeBehavior: behavior,
builder: (BuildContext context) {
return Column(children: <Widget>[makeFocus(1), makeFocus(2)]);
@@ -6445,21 +6452,27 @@
});
await tester.pumpWidget(
- MaterialApp(
- home: Scaffold(
- body: Builder(
+ TestWidgetsApp(
+ home: Center(
+ child: Builder(
builder: (BuildContext context) {
- return ElevatedButton(
+ return TestButton(
onPressed: () {
Navigator.push(
context,
NoAnimationPageRoute(
- pageBuilder: (BuildContext context) => Scaffold(
- appBar: AppBar(title: const Text('Second Route')),
- body: ElevatedButton(
- onPressed: () => Navigator.pop(context),
- child: const Text('Pop'),
- ),
+ pageBuilder: (BuildContext context) => Column(
+ children: [
+ const Text('Second Route'),
+ Expanded(
+ child: Center(
+ child: TestButton(
+ onPressed: () => Navigator.pop(context),
+ child: const Text('Pop'),
+ ),
+ ),
+ ),
+ ],
),
),
);
@@ -6763,16 +6776,7 @@
@override
Route<T> createRoute(BuildContext context) {
- return MaterialPageRoute<T>(builder: (BuildContext context) => Text(name!), settings: this);
- }
-}
-
-class TestPage extends Page<void> {
- const TestPage({super.key, required String super.name, super.arguments});
-
- @override
- Route<void> createRoute(BuildContext context) {
- return MaterialPageRoute<void>(builder: (BuildContext context) => Text(name!), settings: this);
+ return TestRoute<T>(builder: (BuildContext context) => Text(name!), settings: this);
}
}
@@ -6885,15 +6889,15 @@
@override
Widget build(BuildContext context) {
- return Scaffold(
- body: Center(
+ return SizedBox.expand(
+ child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(title),
...buttons,
if (Navigator.of(context).canPop())
- TextButton(
+ TestButton(
onPressed:
onBack ??
() {
@@ -6956,7 +6960,7 @@
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {
case '/':
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext context) {
return _LinksPage(
title: 'Nested - home',
@@ -6964,19 +6968,19 @@
Navigator.of(rootContext).pop();
},
buttons: <Widget>[
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/one');
},
child: const Text('Go to nested/one'),
),
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(context).pushNamed('/popscope');
},
child: const Text('Go to nested/popscope'),
),
- TextButton(
+ TestButton(
onPressed: () {
Navigator.of(rootContext).pop();
},
@@ -6987,13 +6991,13 @@
},
);
case '/one':
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext context) {
return const _LinksPage(title: 'Nested - page one');
},
);
case '/popscope':
- return MaterialPageRoute<void>(
+ return TestRoute<void>(
builder: (BuildContext context) {
return _LinksPage(canPop: widget.popScopePageEnabled, title: 'Nested - PopScope');
},
diff --git a/packages/flutter/test/widgets/route_notification_messages_test.dart b/packages/flutter/test/widgets/route_notification_messages_test.dart
index 27bf645..415a861 100644
--- a/packages/flutter/test/widgets/route_notification_messages_test.dart
+++ b/packages/flutter/test/widgets/route_notification_messages_test.dart
@@ -10,6 +10,8 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
+import 'test_page_tester.dart';
+
class OnTapPage extends StatelessWidget {
const OnTapPage({super.key, required this.id, required this.onTap});
@@ -106,7 +108,7 @@
Directionality(
textDirection: TextDirection.ltr,
child: Navigator(
- pages: const <Page<void>>[TestPage(name: '/')],
+ pages: const <Page<void>>[TestPage(name: '/', child: Placeholder())],
onPopPage: (Route<void> route, void result) => false,
),
),
@@ -119,8 +121,8 @@
textDirection: TextDirection.ltr,
child: Navigator(
pages: const <Page<void>>[
- TestPage(name: '/'),
- TestPage(name: '/abc'),
+ TestPage(name: '/', child: Placeholder()),
+ TestPage(name: '/abc', child: Placeholder()),
],
onPopPage: (Route<void> route, void result) => false,
),
@@ -216,11 +218,14 @@
onTap: () {
// Create a route with no name.
final Route<void> route = PageRouteBuilder<void>(
- pageBuilder: (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- ) => const Text('Nameless Route'),
+ pageBuilder:
+ (
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ ) {
+ return const Text('Nameless Route');
+ },
);
Navigator.push<void>(context, route);
},
@@ -359,19 +364,3 @@
@override
Widget build(BuildContext context) => builder(context, routeInformation);
}
-
-class TestPage extends Page<void> {
- const TestPage({super.key, super.name});
-
- @override
- Route<void> createRoute(BuildContext context) {
- return PageRouteBuilder<void>(
- settings: this,
- pageBuilder: (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- ) => const Placeholder(),
- );
- }
-}
diff --git a/packages/flutter/test/widgets/route_tester.dart b/packages/flutter/test/widgets/route_tester.dart
index eaf1987..fbc5dcf 100644
--- a/packages/flutter/test/widgets/route_tester.dart
+++ b/packages/flutter/test/widgets/route_tester.dart
@@ -19,6 +19,7 @@
this.transitionsBuilder,
super.fullscreenDialog,
super.allowSnapshotting,
+ super.directionalTraversalEdgeBehavior,
}) : assert(child != null || builder != null, 'Either child or builder must be provided.');
final Widget? child;
diff --git a/packages/flutter_test/test/navigator_test.dart b/packages/flutter_test/test/navigator_test.dart
index 6040390..a503c8d 100644
--- a/packages/flutter_test/test/navigator_test.dart
+++ b/packages/flutter_test/test/navigator_test.dart
@@ -36,7 +36,7 @@
},
),
'/2' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const _TestSlightRightPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlideRightPageTransitionsBuilder(),
transitionDurationOverride: const Duration(milliseconds: 456),
reverseTransitionDurationOverride: const Duration(milliseconds: 567),
builder: (BuildContext context) {
@@ -88,7 +88,7 @@
},
),
'/4' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const _TestSlightRightPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlideRightPageTransitionsBuilder(),
builder: (BuildContext context) {
return Center(
child: Column(
@@ -144,7 +144,7 @@
await tester.tap(find.text('Next'));
expect(
observer.transitionDuration,
- const _TestSlightRightPageTransitionsBuilder().transitionDuration,
+ const _TestSlideRightPageTransitionsBuilder().transitionDuration,
);
await observer.pumpPastTransition(tester);
@@ -157,7 +157,7 @@
await tester.tap(find.text('Back'));
expect(
observer.transitionDuration,
- const _TestSlightRightPageTransitionsBuilder().reverseTransitionDuration,
+ const _TestSlideRightPageTransitionsBuilder().reverseTransitionDuration,
);
await observer.pumpPastTransition(tester);
@@ -216,8 +216,8 @@
});
}
-class _TestSlightRightPageTransitionsBuilder extends PageTransitionsBuilder {
- const _TestSlightRightPageTransitionsBuilder();
+class _TestSlideRightPageTransitionsBuilder extends PageTransitionsBuilder {
+ const _TestSlideRightPageTransitionsBuilder();
@override
Widget buildTransitions<T>(