Skip to content
This repository was archived by the owner on Apr 14, 2026. It is now read-only.

Commit 5bd22d7

Browse files
feat: add all navigator calls to mock (#6)
1 parent 66086ff commit 5bd22d7

4 files changed

Lines changed: 553 additions & 38 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
# The .vscode folder contains launch configuration and tasks you configure in
1919
# VS Code which you may wish to be included in version control, so this line
2020
# is commented out by default.
21-
#.vscode/
21+
# .vscode/
22+
.vscode/settings.json
2223

2324
# Flutter/Dart/Pub related
2425
**/doc/api/

lib/mock_navigator.dart

Lines changed: 205 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ class MockNavigatorProvider extends Navigator {
2323

2424
@override
2525
NavigatorState createState() {
26-
return _MockNavigatorState(navigator: navigator)..child = child;
26+
// The hack that makes it all work.
27+
// ignore: no_logic_in_create_state
28+
return _MockNavigatorState(navigator).._child = child;
2729
}
2830

2931
@override
@@ -54,18 +56,214 @@ mixin MockNavigatorDiagnosticsMixin on Object {
5456
}
5557
}
5658

59+
/// Internal class that imitates a [NavigatorState] and maps all the real
60+
/// [NavigatorState] methods to the mock methods for use in testing.
5761
class _MockNavigatorState extends NavigatorState {
58-
_MockNavigatorState({required this.navigator});
62+
_MockNavigatorState(this._navigator);
5963

60-
MockNavigatorBase navigator;
61-
Widget? child;
64+
final MockNavigatorBase _navigator;
65+
Widget? _child;
6266

6367
@override
64-
Future<T?> push<T extends Object?>(Route<T> route) => navigator.push(route);
68+
Widget build(BuildContext context) => _child!;
6569

6670
@override
67-
void pop<T extends Object?>([T? result]) => navigator.pop(result);
71+
Future<T?> push<T extends Object?>(Route<T> route) {
72+
return _navigator.push<T>(route);
73+
}
74+
75+
@override
76+
Future<T?> pushNamed<T extends Object?>(
77+
String routeName, {
78+
Object? arguments,
79+
}) {
80+
return _navigator.pushNamed<T>(
81+
routeName,
82+
arguments: arguments,
83+
);
84+
}
85+
86+
@override
87+
Future<T?> pushNamedAndRemoveUntil<T extends Object?>(
88+
String newRouteName,
89+
RoutePredicate predicate, {
90+
Object? arguments,
91+
}) {
92+
return _navigator.pushNamedAndRemoveUntil<T>(
93+
newRouteName,
94+
predicate,
95+
arguments: arguments,
96+
);
97+
}
98+
99+
@override
100+
Future<T?> pushReplacement<T extends Object?, TO extends Object?>(
101+
Route<T> newRoute, {
102+
TO? result,
103+
}) {
104+
return _navigator.pushReplacement<T, TO>(
105+
newRoute,
106+
result: result,
107+
);
108+
}
109+
110+
@override
111+
Future<T?> pushReplacementNamed<T extends Object?, TO extends Object?>(
112+
String routeName, {
113+
TO? result,
114+
Object? arguments,
115+
}) {
116+
return _navigator.pushReplacementNamed<T, TO>(
117+
routeName,
118+
result: result,
119+
arguments: arguments,
120+
);
121+
}
122+
123+
@override
124+
void pop<T extends Object?>([T? result]) {
125+
return _navigator.pop<T>(result);
126+
}
127+
128+
@override
129+
Future<T?> popAndPushNamed<T extends Object?, TO extends Object?>(
130+
String routeName, {
131+
TO? result,
132+
Object? arguments,
133+
}) {
134+
return _navigator.popAndPushNamed<T, TO>(
135+
routeName,
136+
result: result,
137+
arguments: arguments,
138+
);
139+
}
140+
141+
@override
142+
void popUntil(RoutePredicate predicate) {
143+
return _navigator.popUntil(predicate);
144+
}
145+
146+
@override
147+
Future<T?> pushAndRemoveUntil<T extends Object?>(
148+
Route<T> newRoute,
149+
RoutePredicate predicate,
150+
) {
151+
return _navigator.pushAndRemoveUntil<T>(
152+
newRoute,
153+
predicate,
154+
);
155+
}
68156

69157
@override
70-
Widget build(BuildContext context) => child!;
158+
String restorablePopAndPushNamed<T extends Object?, TO extends Object?>(
159+
String routeName, {
160+
TO? result,
161+
Object? arguments,
162+
}) {
163+
return _navigator.restorablePopAndPushNamed<T, TO>(
164+
routeName,
165+
result: result,
166+
arguments: arguments,
167+
);
168+
}
169+
170+
@override
171+
String restorablePush<T extends Object?>(
172+
RestorableRouteBuilder<T> routeBuilder, {
173+
Object? arguments,
174+
}) {
175+
return _navigator.restorablePush<T>(
176+
routeBuilder,
177+
arguments: arguments,
178+
);
179+
}
180+
181+
@override
182+
String restorablePushAndRemoveUntil<T extends Object?>(
183+
RestorableRouteBuilder<T> newRouteBuilder,
184+
RoutePredicate predicate, {
185+
Object? arguments,
186+
}) {
187+
return _navigator.restorablePushAndRemoveUntil<T>(
188+
newRouteBuilder,
189+
predicate,
190+
arguments: arguments,
191+
);
192+
}
193+
194+
@override
195+
String restorablePushNamed<T extends Object?>(
196+
String routeName, {
197+
Object? arguments,
198+
}) {
199+
return _navigator.restorablePushNamed<T>(
200+
routeName,
201+
arguments: arguments,
202+
);
203+
}
204+
205+
@override
206+
String restorablePushNamedAndRemoveUntil<T extends Object?>(
207+
String newRouteName,
208+
RoutePredicate predicate, {
209+
Object? arguments,
210+
}) {
211+
return _navigator.restorablePushNamedAndRemoveUntil<T>(
212+
newRouteName,
213+
predicate,
214+
arguments: arguments,
215+
);
216+
}
217+
218+
@override
219+
String restorablePushReplacement<T extends Object?, TO extends Object?>(
220+
RestorableRouteBuilder<T> routeBuilder, {
221+
TO? result,
222+
Object? arguments,
223+
}) {
224+
return _navigator.restorablePushReplacement<T, TO>(
225+
routeBuilder,
226+
result: result,
227+
arguments: arguments,
228+
);
229+
}
230+
231+
@override
232+
String restorablePushReplacementNamed<T extends Object?, TO extends Object?>(
233+
String routeName, {
234+
TO? result,
235+
Object? arguments,
236+
}) {
237+
return _navigator.restorablePushReplacementNamed<T, TO>(
238+
routeName,
239+
result: result,
240+
arguments: arguments,
241+
);
242+
}
243+
244+
@override
245+
String restorableReplace<T extends Object?>({
246+
required Route oldRoute,
247+
required RestorableRouteBuilder<T> newRouteBuilder,
248+
Object? arguments,
249+
}) {
250+
return _navigator.restorableReplace<T>(
251+
oldRoute: oldRoute,
252+
newRouteBuilder: newRouteBuilder,
253+
arguments: arguments,
254+
);
255+
}
256+
257+
@override
258+
String restorableReplaceRouteBelow<T extends Object?>({
259+
required Route anchorRoute,
260+
required RestorableRouteBuilder<T> newRouteBuilder,
261+
Object? arguments,
262+
}) {
263+
return _navigator.restorableReplaceRouteBelow<T>(
264+
anchorRoute: anchorRoute,
265+
newRouteBuilder: newRouteBuilder,
266+
arguments: arguments,
267+
);
268+
}
71269
}

pubspec.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ dependencies:
1515
dev_dependencies:
1616
flutter_test:
1717
sdk: flutter
18-
coverage: 0.15.2
19-
very_good_analysis: 2.0.3
20-
mocktail: 0.1.1
18+
mocktail: ^0.1.4
19+
very_good_analysis: 2.1.2

0 commit comments

Comments
 (0)