11import 'package:flutter/material.dart' ;
22import 'package:mocktail/mocktail.dart' ;
33
4+ class _MockMaterialPageRoute extends MaterialPageRoute <void > {
5+ _MockMaterialPageRoute ({required super .builder});
6+
7+ void hackOverlays () {
8+ for (var i = 0 ; i < overlayEntries.length; i++ ) {
9+ final state = OverlayState ();
10+ final entry = OverlayEntry (builder: (_) => const SizedBox ());
11+ try {
12+ // We need to call insert since that is the only way to populate the
13+ // `_overlay` field in the entry. But that method calls a setState,
14+ // which will fail since we are not in a widget tree.
15+ //
16+ // By the time the setState is called, the attribute is already set
17+ // so we just ignore the error and the hack will do its job.
18+ state.insert (entry);
19+ } catch (_) {}
20+ overlayEntries[i] = entry;
21+ }
22+ }
23+ }
24+
425class _FakeRoute <T > extends Fake implements Route <T > {}
526
627/// {@template mock_navigator_provider}
@@ -29,7 +50,13 @@ class MockNavigatorProvider extends Navigator {
2950
3051 @override
3152 RouteFactory ? get onGenerateRoute {
32- return (_) => MaterialPageRoute <dynamic >(builder: (_) => child);
53+ return (_) {
54+ final route = _MockMaterialPageRoute (builder: (_) => child);
55+
56+ navigator._routes.add (route);
57+
58+ return route;
59+ };
3360 }
3461}
3562
@@ -48,6 +75,8 @@ class MockNavigator extends Mock
4875 registerFallbackValue (_FakeRoute <String >());
4976 registerFallbackValue (_FakeRoute <num >());
5077 }
78+
79+ final _routes = < _MockMaterialPageRoute > [];
5180}
5281
5382/// A mixin necessary when implementing a [MockNavigator] .
@@ -74,6 +103,15 @@ class _MockNavigatorState extends NavigatorState {
74103 @override
75104 Widget build (BuildContext context) => _child;
76105
106+ @override
107+ void dispose () {
108+ for (final route in _navigator._routes) {
109+ route.hackOverlays ();
110+ }
111+
112+ super .dispose ();
113+ }
114+
77115 @override
78116 Future <T ?> push <T extends Object ?>(Route <T > route) {
79117 return _navigator.push <T >(route);
0 commit comments