Showing
4 changed files
with
104 additions
and
115 deletions
@@ -4,6 +4,7 @@ export 'src/bottomsheet/bottomsheet.dart'; | @@ -4,6 +4,7 @@ export 'src/bottomsheet/bottomsheet.dart'; | ||
4 | export 'src/extension_navigation.dart'; | 4 | export 'src/extension_navigation.dart'; |
5 | export 'src/nav2/get_information_parser.dart'; | 5 | export 'src/nav2/get_information_parser.dart'; |
6 | export 'src/nav2/get_nav_config.dart'; | 6 | export 'src/nav2/get_nav_config.dart'; |
7 | +export 'src/nav2/get_navigator.dart'; | ||
7 | export 'src/nav2/get_router_delegate.dart'; | 8 | export 'src/nav2/get_router_delegate.dart'; |
8 | export 'src/nav2/router_outlet.dart'; | 9 | export 'src/nav2/router_outlet.dart'; |
9 | export 'src/root/get_cupertino_app.dart'; | 10 | export 'src/root/get_cupertino_app.dart'; |
1 | +import 'package:flutter/widgets.dart'; | ||
2 | +import '../routes/default_route.dart'; | ||
3 | +import '../routes/get_route.dart'; | ||
4 | + | ||
5 | +class GetNavigator extends Navigator { | ||
6 | + GetNavigator.onGenerateRoute({ | ||
7 | + GlobalKey<NavigatorState>? key, | ||
8 | + bool Function(Route<dynamic>, dynamic)? onPopPage, | ||
9 | + required List<GetPage> pages, | ||
10 | + List<NavigatorObserver>? observers, | ||
11 | + bool reportsRouteUpdateToEngine = false, | ||
12 | + TransitionDelegate? transitionDelegate, | ||
13 | + String? initialRoute, | ||
14 | + }) : super( | ||
15 | + //keys should be optional | ||
16 | + key: key, | ||
17 | + initialRoute: initialRoute, | ||
18 | + onPopPage: onPopPage ?? | ||
19 | + (route, result) { | ||
20 | + final didPop = route.didPop(result); | ||
21 | + if (!didPop) { | ||
22 | + return false; | ||
23 | + } | ||
24 | + return true; | ||
25 | + }, | ||
26 | + onGenerateRoute: (settings) { | ||
27 | + final selectedPageList = | ||
28 | + pages.where((element) => element.name == settings.name); | ||
29 | + if (selectedPageList.isNotEmpty) { | ||
30 | + final selectedPage = selectedPageList.first; | ||
31 | + return GetPageRoute( | ||
32 | + page: selectedPage.page, | ||
33 | + settings: settings, | ||
34 | + ); | ||
35 | + } | ||
36 | + }, | ||
37 | + reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, | ||
38 | + pages: pages, | ||
39 | + observers: [ | ||
40 | + // GetObserver(), | ||
41 | + ...?observers, | ||
42 | + ], | ||
43 | + transitionDelegate: | ||
44 | + transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | ||
45 | + ); | ||
46 | + | ||
47 | + GetNavigator({ | ||
48 | + GlobalKey<NavigatorState>? key, | ||
49 | + bool Function(Route<dynamic>, dynamic)? onPopPage, | ||
50 | + required List<GetPage> pages, | ||
51 | + List<NavigatorObserver>? observers, | ||
52 | + bool reportsRouteUpdateToEngine = false, | ||
53 | + TransitionDelegate? transitionDelegate, | ||
54 | + String? initialRoute, | ||
55 | + }) : super( | ||
56 | + //keys should be optional | ||
57 | + key: key, | ||
58 | + initialRoute: initialRoute, | ||
59 | + onPopPage: onPopPage ?? | ||
60 | + (route, result) { | ||
61 | + final didPop = route.didPop(result); | ||
62 | + if (!didPop) { | ||
63 | + return false; | ||
64 | + } | ||
65 | + return true; | ||
66 | + }, | ||
67 | + reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, | ||
68 | + pages: pages, | ||
69 | + observers: [ | ||
70 | + // GetObserver(), | ||
71 | + ...?observers, | ||
72 | + ], | ||
73 | + transitionDelegate: | ||
74 | + transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | ||
75 | + ); | ||
76 | +} |
@@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; | @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; | ||
4 | import 'package:flutter/material.dart'; | 4 | import 'package:flutter/material.dart'; |
5 | import '../../../get.dart'; | 5 | import '../../../get.dart'; |
6 | import '../../../get_state_manager/src/simple/list_notifier.dart'; | 6 | import '../../../get_state_manager/src/simple/list_notifier.dart'; |
7 | +import 'get_navigator.dart'; | ||
7 | 8 | ||
8 | /// Enables the user to customize the intended pop behavior | 9 | /// Enables the user to customize the intended pop behavior |
9 | /// | 10 | /// |
@@ -57,6 +58,9 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -57,6 +58,9 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
57 | final List<NavigatorObserver>? navigatorObservers; | 58 | final List<NavigatorObserver>? navigatorObservers; |
58 | final TransitionDelegate<dynamic>? transitionDelegate; | 59 | final TransitionDelegate<dynamic>? transitionDelegate; |
59 | 60 | ||
61 | + final Iterable<GetPage> Function(GetNavConfig currentNavStack)? | ||
62 | + pickPagesForRootNavigator; | ||
63 | + | ||
60 | GlobalKey<NavigatorState> get navigatorKey => Get.key; | 64 | GlobalKey<NavigatorState> get navigatorKey => Get.key; |
61 | 65 | ||
62 | GetDelegate({ | 66 | GetDelegate({ |
@@ -66,6 +70,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -66,6 +70,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
66 | this.backButtonPopMode = PopMode.History, | 70 | this.backButtonPopMode = PopMode.History, |
67 | this.preventDuplicateHandlingMode = | 71 | this.preventDuplicateHandlingMode = |
68 | PreventDuplicateHandlingMode.ReorderRoutes, | 72 | PreventDuplicateHandlingMode.ReorderRoutes, |
73 | + this.pickPagesForRootNavigator, | ||
69 | }) : notFoundRoute = notFoundRoute ?? | 74 | }) : notFoundRoute = notFoundRoute ?? |
70 | GetPage( | 75 | GetPage( |
71 | name: '/404', | 76 | name: '/404', |
@@ -120,10 +125,6 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -120,10 +125,6 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
120 | return currentConfiguration?.currentPage?.parameters ?? {}; | 125 | return currentConfiguration?.currentPage?.parameters ?? {}; |
121 | } | 126 | } |
122 | 127 | ||
123 | - // void _unsafeHistoryClear() { | ||
124 | - // history.clear(); | ||
125 | - // } | ||
126 | - | ||
127 | /// Adds a new history entry and waits for the result | 128 | /// Adds a new history entry and waits for the result |
128 | Future<void> pushHistory( | 129 | Future<void> pushHistory( |
129 | GetNavConfig config, { | 130 | GetNavConfig config, { |
@@ -163,11 +164,6 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -163,11 +164,6 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
163 | await _unsafeHistoryAdd(config); | 164 | await _unsafeHistoryAdd(config); |
164 | } | 165 | } |
165 | 166 | ||
166 | - // GetPageRoute getPageRoute(RouteSettings? settings) { | ||
167 | - // return PageRedirect(settings ?? RouteSettings(name: '/404'), _notFound()) | ||
168 | - // .page(); | ||
169 | - // } | ||
170 | - | ||
171 | Future<GetNavConfig?> _popHistory() async { | 167 | Future<GetNavConfig?> _popHistory() async { |
172 | if (!_canPopHistory()) return null; | 168 | if (!_canPopHistory()) return null; |
173 | return await _doPopHistory(); | 169 | return await _doPopHistory(); |
@@ -263,36 +259,35 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -263,36 +259,35 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
263 | 259 | ||
264 | /// gets the visual pages from the current history entry | 260 | /// gets the visual pages from the current history entry |
265 | /// | 261 | /// |
266 | - /// visual pages must have [participatesInRootNavigator] set to true | ||
267 | - List<GetPage> getVisualPages() { | ||
268 | - final currentHistory = currentConfiguration; | ||
269 | - if (currentHistory == null) return <GetPage>[]; | ||
270 | - | 262 | + /// visual pages must have [GetPage.participatesInRootNavigator] set to true |
263 | + Iterable<GetPage> getVisualPages(GetNavConfig currentHistory) { | ||
271 | final res = currentHistory.currentTreeBranch | 264 | final res = currentHistory.currentTreeBranch |
272 | .where((r) => r.participatesInRootNavigator != null); | 265 | .where((r) => r.participatesInRootNavigator != null); |
273 | if (res.length == 0) { | 266 | if (res.length == 0) { |
274 | //default behavoir, all routes participate in root navigator | 267 | //default behavoir, all routes participate in root navigator |
275 | - return history.map((e) => e.currentPage!).toList(); | 268 | + return history.map((e) => e.currentPage!); |
276 | } else { | 269 | } else { |
277 | //user specified at least one participatesInRootNavigator | 270 | //user specified at least one participatesInRootNavigator |
278 | return res | 271 | return res |
279 | - .where((element) => element.participatesInRootNavigator == true) | ||
280 | - .toList(); | 272 | + .where((element) => element.participatesInRootNavigator == true); |
281 | } | 273 | } |
282 | } | 274 | } |
283 | 275 | ||
284 | @override | 276 | @override |
285 | Widget build(BuildContext context) { | 277 | Widget build(BuildContext context) { |
286 | - final pages = getVisualPages(); | 278 | + final currentHistory = currentConfiguration; |
279 | + final pages = currentHistory == null | ||
280 | + ? <GetPage>[] | ||
281 | + : pickPagesForRootNavigator?.call(currentHistory) ?? | ||
282 | + getVisualPages(currentHistory); | ||
287 | if (pages.length == 0) return SizedBox.shrink(); | 283 | if (pages.length == 0) return SizedBox.shrink(); |
288 | - final extraObservers = navigatorObservers; | ||
289 | return GetNavigator( | 284 | return GetNavigator( |
290 | key: navigatorKey, | 285 | key: navigatorKey, |
291 | onPopPage: _onPopVisualRoute, | 286 | onPopPage: _onPopVisualRoute, |
292 | - pages: pages, | 287 | + pages: pages.toList(), |
293 | observers: [ | 288 | observers: [ |
294 | GetObserver(), | 289 | GetObserver(), |
295 | - if (extraObservers != null) ...extraObservers, | 290 | + ...?navigatorObservers, |
296 | ], | 291 | ], |
297 | transitionDelegate: | 292 | transitionDelegate: |
298 | transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | 293 | transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), |
@@ -333,35 +328,24 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -333,35 +328,24 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
333 | ), | 328 | ), |
334 | ); | 329 | ); |
335 | } else { | 330 | } else { |
336 | - ///TODO: IMPLEMENT ROUTE NOT FOUND | ||
337 | - | ||
338 | - return Future.value(); | ||
339 | - } | ||
340 | - } | ||
341 | - | ||
342 | - Future<void>? offAndToNamed( | ||
343 | - String page, { | ||
344 | - dynamic arguments, | ||
345 | - int? id, | ||
346 | - dynamic result, | ||
347 | - Map<String, String>? parameters, | ||
348 | - PopMode popMode = PopMode.History, | ||
349 | - }) async { | ||
350 | - if (parameters != null) { | ||
351 | - final uri = Uri(path: page, queryParameters: parameters); | ||
352 | - page = uri.toString(); | 331 | + await pushHistory( |
332 | + GetNavConfig( | ||
333 | + currentTreeBranch: [notFoundRoute], | ||
334 | + location: notFoundRoute.name, | ||
335 | + state: null, //TODO: persist state? | ||
336 | + ), | ||
337 | + ); | ||
353 | } | 338 | } |
354 | - | ||
355 | - await popRoute(result: result); | ||
356 | - return toNamed(page, arguments: arguments, parameters: parameters); | ||
357 | } | 339 | } |
358 | 340 | ||
341 | + //pops the previous route (if there is one) and goes to new route | ||
359 | Future<void> offNamed( | 342 | Future<void> offNamed( |
360 | String page, { | 343 | String page, { |
361 | dynamic arguments, | 344 | dynamic arguments, |
362 | Map<String, String>? parameters, | 345 | Map<String, String>? parameters, |
346 | + PopMode popMode = PopMode.History, | ||
363 | }) async { | 347 | }) async { |
364 | - history.removeLast(); | 348 | + await popRoute(popMode: popMode); |
365 | return toNamed(page, arguments: arguments, parameters: parameters); | 349 | return toNamed(page, arguments: arguments, parameters: parameters); |
366 | } | 350 | } |
367 | 351 | ||
@@ -435,76 +419,3 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -435,76 +419,3 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
435 | return true; | 419 | return true; |
436 | } | 420 | } |
437 | } | 421 | } |
438 | - | ||
439 | -class GetNavigator extends Navigator { | ||
440 | - GetNavigator.onGenerateRoute({ | ||
441 | - GlobalKey<NavigatorState>? key, | ||
442 | - bool Function(Route<dynamic>, dynamic)? onPopPage, | ||
443 | - required List<GetPage> pages, | ||
444 | - List<NavigatorObserver>? observers, | ||
445 | - bool reportsRouteUpdateToEngine = false, | ||
446 | - TransitionDelegate? transitionDelegate, | ||
447 | - String? initialRoute, | ||
448 | - }) : super( | ||
449 | - //keys should be optional | ||
450 | - key: key, | ||
451 | - initialRoute: initialRoute, | ||
452 | - onPopPage: onPopPage ?? | ||
453 | - (route, result) { | ||
454 | - final didPop = route.didPop(result); | ||
455 | - if (!didPop) { | ||
456 | - return false; | ||
457 | - } | ||
458 | - return true; | ||
459 | - }, | ||
460 | - onGenerateRoute: (settings) { | ||
461 | - final selectedPageList = | ||
462 | - pages.where((element) => element.name == settings.name); | ||
463 | - if (selectedPageList.isNotEmpty) { | ||
464 | - final selectedPage = selectedPageList.first; | ||
465 | - return GetPageRoute( | ||
466 | - page: selectedPage.page, | ||
467 | - settings: settings, | ||
468 | - ); | ||
469 | - } | ||
470 | - }, | ||
471 | - reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, | ||
472 | - pages: pages, | ||
473 | - observers: [ | ||
474 | - // GetObserver(), | ||
475 | - ...?observers, | ||
476 | - ], | ||
477 | - transitionDelegate: | ||
478 | - transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | ||
479 | - ); | ||
480 | - | ||
481 | - GetNavigator({ | ||
482 | - GlobalKey<NavigatorState>? key, | ||
483 | - bool Function(Route<dynamic>, dynamic)? onPopPage, | ||
484 | - required List<GetPage> pages, | ||
485 | - List<NavigatorObserver>? observers, | ||
486 | - bool reportsRouteUpdateToEngine = false, | ||
487 | - TransitionDelegate? transitionDelegate, | ||
488 | - String? initialRoute, | ||
489 | - }) : super( | ||
490 | - //keys should be optional | ||
491 | - key: key, | ||
492 | - initialRoute: initialRoute, | ||
493 | - onPopPage: onPopPage ?? | ||
494 | - (route, result) { | ||
495 | - final didPop = route.didPop(result); | ||
496 | - if (!didPop) { | ||
497 | - return false; | ||
498 | - } | ||
499 | - return true; | ||
500 | - }, | ||
501 | - reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, | ||
502 | - pages: pages, | ||
503 | - observers: [ | ||
504 | - // GetObserver(), | ||
505 | - ...?observers, | ||
506 | - ], | ||
507 | - transitionDelegate: | ||
508 | - transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | ||
509 | - ); | ||
510 | -} |
1 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
2 | 2 | ||
3 | import '../../../get.dart'; | 3 | import '../../../get.dart'; |
4 | +import 'get_navigator.dart'; | ||
4 | import 'get_router_delegate.dart'; | 5 | import 'get_router_delegate.dart'; |
5 | 6 | ||
6 | class RouterOutlet<TDelegate extends RouterDelegate<T>, T extends Object> | 7 | class RouterOutlet<TDelegate extends RouterDelegate<T>, T extends Object> |
-
Please register or login to post a comment