Ahmed Fwela

WIP - Improved smart management, bindings,

parameters, etc..
@@ -9,6 +9,8 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -9,6 +9,8 @@ class GetDelegate extends RouterDelegate<GetPage>
9 with ListenableMixin, ListNotifierMixin { 9 with ListenableMixin, ListNotifierMixin {
10 final List<GetPage> routes = <GetPage>[]; 10 final List<GetPage> routes = <GetPage>[];
11 11
  12 + final pageRoutes = <GetPage, GetPageRoute>{};
  13 +
12 GetPage? notFoundRoute; 14 GetPage? notFoundRoute;
13 15
14 final List<NavigatorObserver>? dipNavObservers; 16 final List<NavigatorObserver>? dipNavObservers;
@@ -56,6 +58,7 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -56,6 +58,7 @@ class GetDelegate extends RouterDelegate<GetPage>
56 @override 58 @override
57 Future<void> setNewRoutePath(GetPage configuration) { 59 Future<void> setNewRoutePath(GetPage configuration) {
58 routes.clear(); 60 routes.clear();
  61 + pageRoutes.clear();
59 return pushRoute(configuration); 62 return pushRoute(configuration);
60 } 63 }
61 64
@@ -67,6 +70,8 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -67,6 +70,8 @@ class GetDelegate extends RouterDelegate<GetPage>
67 return route; 70 return route;
68 } 71 }
69 72
  73 + GetPageRoute? get currentRoute => pageRoutes[currentConfiguration];
  74 +
70 Future<T?> toNamed<T>(String route) { 75 Future<T?> toNamed<T>(String route) {
71 final page = Get.routeTree.matchRoute(route); 76 final page = Get.routeTree.matchRoute(route);
72 if (page.route != null) { 77 if (page.route != null) {
@@ -95,23 +100,25 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -95,23 +100,25 @@ class GetDelegate extends RouterDelegate<GetPage>
95 } 100 }
96 101
97 Future<T?> pushRoute<T>( 102 Future<T?> pushRoute<T>(
98 - GetPage route, { 103 + GetPage page, {
99 bool removeUntil = false, 104 bool removeUntil = false,
100 bool replaceCurrent = false, 105 bool replaceCurrent = false,
101 bool rebuildStack = true, 106 bool rebuildStack = true,
102 }) { 107 }) {
103 final completer = Completer<T?>(); 108 final completer = Completer<T?>();
104 - _resultCompleter[route] = completer; 109 + _resultCompleter[page] = completer;
105 110
106 - route = route.copy(unknownRoute: _notFound()); 111 + page = page.copy(unknownRoute: _notFound());
107 assert(!(removeUntil && replaceCurrent), 112 assert(!(removeUntil && replaceCurrent),
108 'Only removeUntil or replaceCurrent should by true!'); 113 'Only removeUntil or replaceCurrent should by true!');
109 if (removeUntil) { 114 if (removeUntil) {
110 routes.clear(); 115 routes.clear();
  116 + pageRoutes.clear();
111 } else if (replaceCurrent && routes.isNotEmpty) { 117 } else if (replaceCurrent && routes.isNotEmpty) {
112 - routes.removeLast(); 118 + final lastPage = routes.removeLast();
  119 + pageRoutes.remove(lastPage);
113 } 120 }
114 - addPage(route); 121 + addPage(page);
115 if (rebuildStack) { 122 if (rebuildStack) {
116 refresh(); 123 refresh();
117 } 124 }
@@ -153,7 +160,7 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -153,7 +160,7 @@ class GetDelegate extends RouterDelegate<GetPage>
153 } 160 }
154 161
155 bool canPop() { 162 bool canPop() {
156 - return routes.isNotEmpty; 163 + return routes.length > 1;
157 } 164 }
158 165
159 bool _onPopPage(Route<dynamic> route, dynamic result) { 166 bool _onPopPage(Route<dynamic> route, dynamic result) {
@@ -161,14 +168,24 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -161,14 +168,24 @@ class GetDelegate extends RouterDelegate<GetPage>
161 if (!didPop) { 168 if (!didPop) {
162 return false; 169 return false;
163 } 170 }
164 - routes.remove(route.settings); 171 + final settings = route.settings;
  172 + if (settings is GetPage) {
  173 + removePage(settings);
  174 + }
165 refresh(); 175 refresh();
166 return true; 176 return true;
167 } 177 }
168 178
169 void removePage(GetPage page) { 179 void removePage(GetPage page) {
  180 + final isLast = routes.last == page;
  181 + //check if it's last
170 routes.remove(page); 182 routes.remove(page);
171 - 183 + final oldPageRoute = pageRoutes.remove(page);
  184 + if (isLast && oldPageRoute != null) {
  185 + _currentRoutePopped(oldPageRoute);
  186 + final newPageRoute = pageRoutes[routes.last];
  187 + if (newPageRoute != null) _currentRouteChanged(newPageRoute);
  188 + }
172 refresh(); 189 refresh();
173 } 190 }
174 191
@@ -176,11 +193,28 @@ class GetDelegate extends RouterDelegate<GetPage> @@ -176,11 +193,28 @@ class GetDelegate extends RouterDelegate<GetPage>
176 routes.add( 193 routes.add(
177 route, 194 route,
178 ); 195 );
  196 + final pageRoute =
  197 + pageRoutes[route] = PageRedirect(route, _notFound()).page();
  198 + _currentRouteChanged(pageRoute);
179 refresh(); 199 refresh();
180 } 200 }
181 201
182 void addRoutes(List<GetPage> pages) { 202 void addRoutes(List<GetPage> pages) {
183 routes.addAll(pages); 203 routes.addAll(pages);
  204 + for (var item in pages) {
  205 + pageRoutes[item] = PageRedirect(item, _notFound()).page();
  206 + }
  207 + final pageRoute = pageRoutes[routes.last];
  208 + if (pageRoute != null) _currentRouteChanged(pageRoute);
184 refresh(); 209 refresh();
185 } 210 }
  211 +
  212 + void _currentRoutePopped(GetPageRoute route) {
  213 + route.dispose();
  214 + }
  215 +
  216 + void _currentRouteChanged(GetPageRoute route) {
  217 + //transition?
  218 + //buildPage? -> in router outlet
  219 + }
186 } 220 }