@@ -10,11 +10,20 @@ import 'package:go_router/go_router.dart';
10
10
11
11
class _GoRouteDataBuild extends GoRouteData {
12
12
const _GoRouteDataBuild ();
13
+
13
14
@override
14
15
Widget build (BuildContext context, GoRouterState state) =>
15
16
const SizedBox (key: Key ('build' ));
16
17
}
17
18
19
+ class _ShellRouteDataRedirectPage extends ShellRouteData {
20
+ const _ShellRouteDataRedirectPage ();
21
+
22
+ @override
23
+ FutureOr <String > redirect (BuildContext context, GoRouterState state) =>
24
+ '/build-page' ;
25
+ }
26
+
18
27
class _ShellRouteDataBuilder extends ShellRouteData {
19
28
const _ShellRouteDataBuilder ();
20
29
@@ -49,7 +58,9 @@ class _ShellRouteDataWithKey extends ShellRouteData {
49
58
50
59
class _GoRouteDataBuildWithKey extends GoRouteData {
51
60
const _GoRouteDataBuildWithKey (this .key);
61
+
52
62
final Key key;
63
+
53
64
@override
54
65
Widget build (BuildContext context, GoRouterState state) => SizedBox (key: key);
55
66
}
@@ -71,6 +82,7 @@ final ShellRoute _shellRouteDataBuilder = ShellRouteData.$route(
71
82
72
83
class _GoRouteDataBuildPage extends GoRouteData {
73
84
const _GoRouteDataBuildPage ();
85
+
74
86
@override
75
87
Page <void > buildPage (BuildContext context, GoRouterState state) =>
76
88
const MaterialPage <void >(
@@ -95,6 +107,14 @@ class _ShellRouteDataPageBuilder extends ShellRouteData {
95
107
);
96
108
}
97
109
110
+ class _StatefulShellRouteDataRedirectPage extends StatefulShellRouteData {
111
+ const _StatefulShellRouteDataRedirectPage ();
112
+
113
+ @override
114
+ FutureOr <String > redirect (BuildContext context, GoRouterState state) =>
115
+ '/build-page' ;
116
+ }
117
+
98
118
final GoRoute _goRouteDataBuildPage = GoRouteData .$route (
99
119
path: '/build-page' ,
100
120
factory : (GoRouterState state) => const _GoRouteDataBuildPage (),
@@ -110,6 +130,21 @@ final ShellRoute _shellRouteDataPageBuilder = ShellRouteData.$route(
110
130
],
111
131
);
112
132
133
+ final ShellRoute _shellRouteDataRedirect = ShellRouteData .$route (
134
+ factory : (GoRouterState state) => const _ShellRouteDataPageBuilder (),
135
+ routes: < RouteBase > [
136
+ ShellRouteData .$route (
137
+ factory : (GoRouterState state) => const _ShellRouteDataRedirectPage (),
138
+ routes: < RouteBase > [
139
+ GoRouteData .$route (
140
+ path: '/child' ,
141
+ factory : (GoRouterState state) => const _GoRouteDataBuild (),
142
+ ),
143
+ ],
144
+ ),
145
+ ],
146
+ );
147
+
113
148
class _StatefulShellRouteDataBuilder extends StatefulShellRouteData {
114
149
const _StatefulShellRouteDataBuilder ();
115
150
@@ -174,6 +209,7 @@ final StatefulShellRoute _statefulShellRouteDataPageBuilder =
174
209
175
210
class _GoRouteDataRedirectPage extends GoRouteData {
176
211
const _GoRouteDataRedirectPage ();
212
+
177
213
@override
178
214
FutureOr <String > redirect (BuildContext context, GoRouterState state) =>
179
215
'/build-page' ;
@@ -311,6 +347,23 @@ void main() {
311
347
expect (find.byKey (const Key ('page-builder' )), findsOneWidget);
312
348
},
313
349
);
350
+
351
+ testWidgets (
352
+ 'It should redirect using the overridden redirect method' ,
353
+ (WidgetTester tester) async {
354
+ final GoRouter goRouter = GoRouter (
355
+ initialLocation: '/child' ,
356
+ routes: < RouteBase > [
357
+ _goRouteDataBuildPage,
358
+ _shellRouteDataRedirect,
359
+ ],
360
+ );
361
+ addTearDown (goRouter.dispose);
362
+ await tester.pumpWidget (MaterialApp .router (routerConfig: goRouter));
363
+ expect (find.byKey (const Key ('build' )), findsNothing);
364
+ expect (find.byKey (const Key ('buildPage' )), findsOneWidget);
365
+ },
366
+ );
314
367
});
315
368
316
369
group ('StatefulShellRouteData' , () {
@@ -381,6 +434,36 @@ void main() {
381
434
},
382
435
);
383
436
437
+ testWidgets (
438
+ 'It should redirect using the overridden StatefulShellRoute redirect method' ,
439
+ (WidgetTester tester) async {
440
+ final GoRouter goRouter = GoRouter (
441
+ initialLocation: '/child' ,
442
+ routes: < RouteBase > [
443
+ _goRouteDataBuildPage,
444
+ StatefulShellRouteData .$route (
445
+ factory : (GoRouterState state) =>
446
+ const _StatefulShellRouteDataRedirectPage (),
447
+ branches: < StatefulShellBranch > [
448
+ StatefulShellBranchData .$branch (
449
+ routes: < GoRoute > [
450
+ GoRouteData .$route (
451
+ path: '/child' ,
452
+ factory : (GoRouterState state) => const _GoRouteDataBuild (),
453
+ ),
454
+ ],
455
+ )
456
+ ],
457
+ )
458
+ ],
459
+ );
460
+ addTearDown (goRouter.dispose);
461
+ await tester.pumpWidget (MaterialApp .router (routerConfig: goRouter));
462
+ expect (find.byKey (const Key ('build' )), findsNothing);
463
+ expect (find.byKey (const Key ('buildPage' )), findsOneWidget);
464
+ },
465
+ );
466
+
384
467
testWidgets (
385
468
'It should redirect using the overridden redirect method' ,
386
469
(WidgetTester tester) async {
0 commit comments