Jonny Borges
Committed by GitHub

Merge pull request #1520 from Bdaya-Dev/master

Improvements to router outlet
@@ -22,7 +22,7 @@ class HomeView extends GetView<HomeController> { @@ -22,7 +22,7 @@ class HomeView extends GetView<HomeController> {
22 return Scaffold( 22 return Scaffold(
23 body: GetRouterOutlet( 23 body: GetRouterOutlet(
24 name: Routes.HOME, 24 name: Routes.HOME,
25 - emptyPage: (delegate) => DashboardView(), 25 + emptyWidget: (delegate) => DashboardView(),
26 pickPages: (currentNavStack) { 26 pickPages: (currentNavStack) {
27 print('Home RouterOutlet: $currentNavStack'); 27 print('Home RouterOutlet: $currentNavStack');
28 28
@@ -20,24 +20,8 @@ class RootView extends GetView<RootController> { @@ -20,24 +20,8 @@ class RootView extends GetView<RootController> {
20 ), 20 ),
21 body: GetRouterOutlet( 21 body: GetRouterOutlet(
22 name: '/', 22 name: '/',
23 - emptyPage: (delegate) {  
24 - return Center(  
25 - child: Column(  
26 - mainAxisSize: MainAxisSize.min,  
27 - children: [  
28 - Text('<<<< Select something from the drawer on the left'),  
29 - Builder(  
30 - builder: (context) => MaterialButton(  
31 - child: Icon(Icons.open_in_new_outlined),  
32 - onPressed: () {  
33 - Scaffold.of(context).openDrawer();  
34 - },  
35 - ),  
36 - )  
37 - ],  
38 - ),  
39 - );  
40 - }, 23 + emptyPage: (delegate) =>
  24 + Get.routeTree.matchRoute(Routes.HOME).route!,
41 pickPages: (currentNavStack) { 25 pickPages: (currentNavStack) {
42 //show all routes here except the root view 26 //show all routes here except the root view
43 print('Root RouterOutlet: $currentNavStack'); 27 print('Root RouterOutlet: $currentNavStack');
@@ -100,10 +100,10 @@ class GetDelegate extends RouterDelegate<GetNavConfig> @@ -100,10 +100,10 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
100 history.add(config); 100 history.add(config);
101 } 101 }
102 102
103 - GetPageRoute getPageRoute(RouteSettings? settings) {  
104 - return PageRedirect(settings ?? RouteSettings(name: '/404'), _notFound())  
105 - .page();  
106 - } 103 + // GetPageRoute getPageRoute(RouteSettings? settings) {
  104 + // return PageRedirect(settings ?? RouteSettings(name: '/404'), _notFound())
  105 + // .page();
  106 + // }
107 107
108 GetNavConfig? _popHistory() { 108 GetNavConfig? _popHistory() {
109 if (!_canPopHistory()) return null; 109 if (!_canPopHistory()) return null;
@@ -344,36 +344,25 @@ class GetDelegate extends RouterDelegate<GetNavConfig> @@ -344,36 +344,25 @@ class GetDelegate extends RouterDelegate<GetNavConfig>
344 } 344 }
345 } 345 }
346 346
347 -class GetNavigator extends StatelessWidget {  
348 - const GetNavigator({  
349 - Key? key,  
350 - this.navigatorKey,  
351 - required this.onPopPage,  
352 - required this.pages,  
353 - this.observers,  
354 - this.transitionDelegate,  
355 - required this.name,  
356 - }) : super(key: key);  
357 - final GlobalKey<NavigatorState>? navigatorKey;  
358 - final bool Function(Route<dynamic>, dynamic) onPopPage;  
359 - final List<Page> pages;  
360 - final List<NavigatorObserver>? observers;  
361 - final TransitionDelegate? transitionDelegate;  
362 - final String name;  
363 -  
364 - @override  
365 - Widget build(BuildContext context) {  
366 - Get.key;  
367 - return Navigator(  
368 - key: navigatorKey ?? Get.nestedKey(name), 347 +class GetNavigator extends Navigator {
  348 + GetNavigator({
  349 + GlobalKey<NavigatorState>? key,
  350 + bool Function(Route<dynamic>, dynamic)? onPopPage,
  351 + required List<Page> pages,
  352 + List<NavigatorObserver>? observers,
  353 + TransitionDelegate? transitionDelegate,
  354 + String? name,
  355 + }) : assert(key != null || name != null,
  356 + 'GetNavigator should either have a key or a name set'),
  357 + super(
  358 + key: key ?? Get.nestedKey(name),
369 onPopPage: onPopPage, 359 onPopPage: onPopPage,
370 pages: pages, 360 pages: pages,
371 observers: [ 361 observers: [
372 GetObserver(), 362 GetObserver(),
373 - if (observers != null) ...observers!, 363 + if (observers != null) ...observers,
374 ], 364 ],
375 transitionDelegate: 365 transitionDelegate:
376 transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), 366 transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(),
377 ); 367 );
378 - }  
379 } 368 }
@@ -89,29 +89,30 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, GetNavConfig> { @@ -89,29 +89,30 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, GetNavConfig> {
89 ); 89 );
90 90
91 GetRouterOutlet({ 91 GetRouterOutlet({
92 - Widget Function(GetDelegate delegate)? emptyPage, 92 + Widget Function(GetDelegate delegate)? emptyWidget,
  93 + GetPage Function(GetDelegate delegate)? emptyPage,
93 required List<GetPage> Function(GetNavConfig currentNavStack) pickPages, 94 required List<GetPage> Function(GetNavConfig currentNavStack) pickPages,
94 bool Function(Route<dynamic>, dynamic)? onPopPage, 95 bool Function(Route<dynamic>, dynamic)? onPopPage,
95 required String name, 96 required String name,
96 - }) : super( 97 + }) : assert(
  98 + (emptyPage == null && emptyWidget == null) ||
  99 + (emptyPage != null && emptyWidget == null) ||
  100 + (emptyPage == null && emptyWidget != null),
  101 + 'Either use emptyPage or emptyWidget'),
  102 + super(
97 pageBuilder: (context, rDelegate, page) { 103 pageBuilder: (context, rDelegate, page) {
98 - final pageRoute = rDelegate.getPageRoute(page);  
99 -  
100 - if (page != null) { 104 + var pageRes = page ?? emptyPage?.call(rDelegate);
  105 + if (pageRes != null) {
101 return GetNavigator( 106 return GetNavigator(
102 onPopPage: onPopPage ?? 107 onPopPage: onPopPage ??
103 (a, c) { 108 (a, c) {
104 return true; 109 return true;
105 }, 110 },
106 - pages: [page], 111 + pages: [pageRes],
107 name: name, 112 name: name,
108 ); 113 );
109 } 114 }
110 -  
111 - /// TODO: improve this logic abit  
112 - return (emptyPage?.call(rDelegate) ??  
113 - pageRoute.page?.call() ??  
114 - SizedBox.shrink()); 115 + return (emptyWidget?.call(rDelegate) ?? SizedBox.shrink());
115 }, 116 },
116 pickPages: pickPages, 117 pickPages: pickPages,
117 delegate: Get.getDelegate(), 118 delegate: Get.getDelegate(),