Showing
8 changed files
with
183 additions
and
93 deletions
@@ -30,7 +30,7 @@ class GetInformationParser extends RouteInformationParser<GetNavConfig> { | @@ -30,7 +30,7 @@ class GetInformationParser extends RouteInformationParser<GetNavConfig> { | ||
30 | 30 | ||
31 | return SynchronousFuture( | 31 | return SynchronousFuture( |
32 | GetNavConfig( | 32 | GetNavConfig( |
33 | - currentTreeBranch: matchResult.treeBranch, | 33 | + currentTreeBranch: matchResult.currentTreeBranch, |
34 | location: location, | 34 | location: location, |
35 | state: routeInformation.state, | 35 | state: routeInformation.state, |
36 | ), | 36 | ), |
@@ -46,9 +46,9 @@ class GetNavConfig extends RouteInformation { | @@ -46,9 +46,9 @@ class GetNavConfig extends RouteInformation { | ||
46 | 46 | ||
47 | static GetNavConfig? fromRoute(String route) { | 47 | static GetNavConfig? fromRoute(String route) { |
48 | final res = Get.routeTree.matchRoute(route); | 48 | final res = Get.routeTree.matchRoute(route); |
49 | - if (res.treeBranch.isEmpty) return null; | 49 | + if (res.currentTreeBranch.isEmpty) return null; |
50 | return GetNavConfig( | 50 | return GetNavConfig( |
51 | - currentTreeBranch: res.treeBranch, | 51 | + currentTreeBranch: res.currentTreeBranch, |
52 | location: route, | 52 | location: route, |
53 | state: null, | 53 | state: null, |
54 | ); | 54 | ); |
@@ -308,7 +308,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -308,7 +308,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
308 | 308 | ||
309 | Future<void> toNamed( | 309 | Future<void> toNamed( |
310 | String page, { | 310 | String page, { |
311 | - dynamic arguments, | 311 | + PageSettings? arguments, |
312 | Map<String, String>? parameters, | 312 | Map<String, String>? parameters, |
313 | }) async { | 313 | }) async { |
314 | if (parameters != null) { | 314 | if (parameters != null) { |
@@ -322,7 +322,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -322,7 +322,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
322 | if (decoder.route != null) { | 322 | if (decoder.route != null) { |
323 | await pushHistory( | 323 | await pushHistory( |
324 | GetNavConfig( | 324 | GetNavConfig( |
325 | - currentTreeBranch: decoder.treeBranch, | 325 | + currentTreeBranch: decoder.currentTreeBranch, |
326 | location: page, | 326 | location: page, |
327 | state: null, //TODO: persist state? | 327 | state: null, //TODO: persist state? |
328 | ), | 328 | ), |
@@ -341,7 +341,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | @@ -341,7 +341,7 @@ class GetDelegate extends RouterDelegate<GetNavConfig> | ||
341 | //pops the previous route (if there is one) and goes to new route | 341 | //pops the previous route (if there is one) and goes to new route |
342 | Future<void> offNamed( | 342 | Future<void> offNamed( |
343 | String page, { | 343 | String page, { |
344 | - dynamic arguments, | 344 | + PageSettings? arguments, |
345 | Map<String, String>? parameters, | 345 | Map<String, String>? parameters, |
346 | PopMode popMode = PopMode.History, | 346 | PopMode popMode = PopMode.History, |
347 | }) async { | 347 | }) async { |
@@ -2,16 +2,19 @@ import 'dart:async'; | @@ -2,16 +2,19 @@ import 'dart:async'; | ||
2 | 2 | ||
3 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
4 | 4 | ||
5 | -import '../../../../get.dart'; | 5 | +import '../../../../get_state_manager/src/simple/get_state.dart'; |
6 | import '../../../../get_state_manager/src/simple/list_notifier.dart'; | 6 | import '../../../../get_state_manager/src/simple/list_notifier.dart'; |
7 | +import '../../../../get_utils/src/platform/platform.dart'; | ||
8 | +import '../../../../route_manager.dart'; | ||
9 | +import '../../root/parse_route.dart'; | ||
7 | import '../url_strategy/url_strategy.dart'; | 10 | import '../url_strategy/url_strategy.dart'; |
8 | 11 | ||
9 | -class GetNavigation extends RouterDelegate<PageSettings> | 12 | +class GetNavigation extends RouterDelegate<RouteDecoder> |
10 | with | 13 | with |
11 | ListNotifierSingleMixin, | 14 | ListNotifierSingleMixin, |
12 | - PopNavigatorRouterDelegateMixin<PageSettings>, | 15 | + PopNavigatorRouterDelegateMixin<RouteDecoder>, |
13 | IGetNavigation { | 16 | IGetNavigation { |
14 | - final _activePages = <GetPage>[]; | 17 | + final _activePages = <RouteDecoder>[]; |
15 | final GetPage _unknownPage; | 18 | final GetPage _unknownPage; |
16 | final List<NavigatorObserver>? navigatorObservers; | 19 | final List<NavigatorObserver>? navigatorObservers; |
17 | final String? restorationScopeId; | 20 | final String? restorationScopeId; |
@@ -21,7 +24,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -21,7 +24,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
21 | static late final GetNavigation instance; | 24 | static late final GetNavigation instance; |
22 | 25 | ||
23 | @override | 26 | @override |
24 | - Future<void> setInitialRoutePath(PageSettings configuration) async { | 27 | + Future<void> setInitialRoutePath(RouteDecoder configuration) async { |
25 | setNewRoutePath(configuration); | 28 | setNewRoutePath(configuration); |
26 | } | 29 | } |
27 | 30 | ||
@@ -50,7 +53,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -50,7 +53,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
50 | } | 53 | } |
51 | 54 | ||
52 | @protected | 55 | @protected |
53 | - GetPage<T>? _getPage<T>(PageSettings arguments) { | 56 | + RouteDecoder? _getRouteDecoder<T>(PageSettings arguments) { |
54 | var page = arguments.uri.path; | 57 | var page = arguments.uri.path; |
55 | final parameters = arguments.params; | 58 | final parameters = arguments.params; |
56 | if (parameters.isNotEmpty) { | 59 | if (parameters.isNotEmpty) { |
@@ -59,23 +62,32 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -59,23 +62,32 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
59 | } | 62 | } |
60 | 63 | ||
61 | final decoder = Get.routeTree.matchRoute(page, arguments: arguments); | 64 | final decoder = Get.routeTree.matchRoute(page, arguments: arguments); |
62 | - decoder.replaceArguments(arguments); | 65 | + final route = decoder.route; |
66 | + if (route == null) return null; | ||
67 | + return _configureRouterDecoder(decoder, arguments); | ||
68 | + // decoder.replaceArguments(arguments); | ||
63 | //decoder.replaceParameters(arguments) | 69 | //decoder.replaceParameters(arguments) |
64 | 70 | ||
65 | - return decoder.route as GetPage<T>?; | 71 | + // return decoder; |
66 | } | 72 | } |
67 | 73 | ||
68 | @protected | 74 | @protected |
69 | - GetPage<T> _buildSettings<T>(GetPage<T> page, PageSettings arguments) { | ||
70 | - return page.copy( | ||
71 | - completer: _activePages.isEmpty ? null : Completer(), | ||
72 | - arguments: arguments); | 75 | + RouteDecoder _configureRouterDecoder<T>( |
76 | + RouteDecoder decoder, PageSettings arguments) { | ||
77 | + // final decoder = Get.routeTree.matchRoute(page.name, arguments: arguments); | ||
78 | + | ||
79 | + decoder.route = decoder.route?.copy( | ||
80 | + completer: _activePages.isEmpty ? null : Completer(), | ||
81 | + arguments: arguments, | ||
82 | + parameters: arguments.params, | ||
83 | + ); | ||
84 | + return decoder; | ||
73 | } | 85 | } |
74 | 86 | ||
75 | - Future<T?> _push<T>(PageSettings arguments, GetPage<T> page) async { | ||
76 | - final activePage = _buildSettings<T>(page, arguments); | ||
77 | - final onStackPage = _activePages | ||
78 | - .firstWhereOrNull((element) => element.key == activePage.key); | 87 | + Future<T?> _push<T>(RouteDecoder activePage) async { |
88 | + // final activePage = _configureRouterDecoder<T>(page, arguments); | ||
89 | + final onStackPage = _activePages.firstWhereOrNull( | ||
90 | + (element) => element.route?.key == activePage.route?.key); | ||
79 | 91 | ||
80 | /// There are no duplicate routes in the stack | 92 | /// There are no duplicate routes in the stack |
81 | if (onStackPage == null) { | 93 | if (onStackPage == null) { |
@@ -86,19 +98,33 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -86,19 +98,33 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
86 | _activePages.add(onStackPage); | 98 | _activePages.add(onStackPage); |
87 | } | 99 | } |
88 | refresh(); | 100 | refresh(); |
89 | - return activePage.completer?.future; | 101 | + return activePage.route?.completer?.future as Future<T?>?; |
90 | } | 102 | } |
91 | 103 | ||
92 | Future<T?> _replace<T>(PageSettings arguments, GetPage<T> page) async { | 104 | Future<T?> _replace<T>(PageSettings arguments, GetPage<T> page) async { |
93 | final index = _activePages.length > 1 ? _activePages.length - 1 : 0; | 105 | final index = _activePages.length > 1 ? _activePages.length - 1 : 0; |
94 | - final activePage = _buildSettings<T>(page, arguments); | ||
95 | - Get.addPage(activePage); | 106 | + Get.addPage(page); |
107 | + | ||
108 | + final route = _getRouteDecoder(arguments); | ||
109 | + | ||
110 | + final activePage = _configureRouterDecoder<T>(route!, arguments); | ||
111 | + | ||
96 | _activePages[index] = activePage; | 112 | _activePages[index] = activePage; |
97 | 113 | ||
98 | refresh(); | 114 | refresh(); |
99 | - final result = await activePage.completer?.future; | ||
100 | - Get.removePage(activePage); | 115 | + final result = await activePage.route?.completer?.future as Future<T?>; |
116 | + Get.removePage(page); | ||
117 | + | ||
118 | + return result; | ||
119 | + } | ||
120 | + | ||
121 | + Future<T?> _replaceNamed<T>(RouteDecoder activePage) async { | ||
122 | + final index = _activePages.length > 1 ? _activePages.length - 1 : 0; | ||
123 | + // final activePage = _configureRouterDecoder<T>(page, arguments); | ||
124 | + _activePages[index] = activePage; | ||
101 | 125 | ||
126 | + refresh(); | ||
127 | + final result = await activePage.route?.completer?.future as Future<T?>; | ||
102 | return result; | 128 | return result; |
103 | } | 129 | } |
104 | 130 | ||
@@ -120,16 +146,16 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -120,16 +146,16 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
120 | 146 | ||
121 | @protected | 147 | @protected |
122 | void _popWithResult<T>([T? result]) { | 148 | void _popWithResult<T>([T? result]) { |
123 | - final completer = _activePages.removeLast().completer; | 149 | + final completer = _activePages.removeLast().route?.completer; |
124 | if (completer?.isCompleted == false) completer!.complete(result); | 150 | if (completer?.isCompleted == false) completer!.complete(result); |
125 | } | 151 | } |
126 | 152 | ||
127 | @override | 153 | @override |
128 | Future<T?> toNamed<T>(String page, [Object? data]) async { | 154 | Future<T?> toNamed<T>(String page, [Object? data]) async { |
129 | final arguments = _buildPageSettings(page, data); | 155 | final arguments = _buildPageSettings(page, data); |
130 | - final route = _getPage<T>(arguments); | 156 | + final route = _getRouteDecoder<T>(arguments); |
131 | if (route != null) { | 157 | if (route != null) { |
132 | - return _push<T>(arguments, route); | 158 | + return _push<T>(route); |
133 | } | 159 | } |
134 | throw 'Route $page not registered'; | 160 | throw 'Route $page not registered'; |
135 | } | 161 | } |
@@ -152,7 +178,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -152,7 +178,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
152 | double Function(BuildContext context)? gestureWidth, | 178 | double Function(BuildContext context)? gestureWidth, |
153 | }) async { | 179 | }) async { |
154 | routeName = _cleanRouteName("/${page.runtimeType}"); | 180 | routeName = _cleanRouteName("/${page.runtimeType}"); |
155 | - final route = GetPage<T>( | 181 | + final getPage = GetPage<T>( |
156 | name: routeName, | 182 | name: routeName, |
157 | opaque: opaque ?? true, | 183 | opaque: opaque ?? true, |
158 | page: page, | 184 | page: page, |
@@ -165,10 +191,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -165,10 +191,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
165 | binding: binding, | 191 | binding: binding, |
166 | transitionDuration: duration ?? Get.defaultTransitionDuration, | 192 | transitionDuration: duration ?? Get.defaultTransitionDuration, |
167 | ); | 193 | ); |
168 | - Get.addPage(route); | 194 | + Get.addPage(getPage); |
169 | final args = _buildPageSettings(routeName, arguments); | 195 | final args = _buildPageSettings(routeName, arguments); |
170 | - final result = await _push<T>(args, route); | ||
171 | - Get.removePage(route); | 196 | + final route = _getRouteDecoder<T>(args); |
197 | + final result = await _push<T>(route!); | ||
198 | + Get.removePage(getPage); | ||
172 | return result; | 199 | return result; |
173 | } | 200 | } |
174 | 201 | ||
@@ -244,11 +271,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -244,11 +271,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
244 | 271 | ||
245 | final newPredicate = predicate ?? (route) => false; | 272 | final newPredicate = predicate ?? (route) => false; |
246 | 273 | ||
247 | - while (_activePages.length > 1 && !newPredicate(_activePages.last)) { | 274 | + while (_activePages.length > 1 && !newPredicate(_activePages.last.route!)) { |
248 | _popWithResult(); | 275 | _popWithResult(); |
249 | } | 276 | } |
250 | 277 | ||
251 | - return _push(args, route); | 278 | + return _replace(args, route); |
252 | } | 279 | } |
253 | 280 | ||
254 | @override | 281 | @override |
@@ -260,26 +287,25 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -260,26 +287,25 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
260 | Map<String, String>? parameters, | 287 | Map<String, String>? parameters, |
261 | }) async { | 288 | }) async { |
262 | final args = _buildPageSettings(page, arguments); | 289 | final args = _buildPageSettings(page, arguments); |
263 | - final route = _getPage<T>(args); | 290 | + final route = _getRouteDecoder<T>(args); |
264 | if (route == null) return null; | 291 | if (route == null) return null; |
265 | 292 | ||
266 | // final newPredicate = predicate ?? (route) => false; | 293 | // final newPredicate = predicate ?? (route) => false; |
267 | 294 | ||
268 | while (_activePages.length > 1) { | 295 | while (_activePages.length > 1) { |
269 | _activePages.removeLast(); | 296 | _activePages.removeLast(); |
270 | - removeLastHistory(null); | ||
271 | } | 297 | } |
272 | 298 | ||
273 | - return _replace(args, route); | 299 | + return _replaceNamed(route); |
274 | } | 300 | } |
275 | 301 | ||
276 | @override | 302 | @override |
277 | Future<T?> offNamed<T>(String page, [Object? data]) async { | 303 | Future<T?> offNamed<T>(String page, [Object? data]) async { |
278 | final arguments = _buildPageSettings(page, data); | 304 | final arguments = _buildPageSettings(page, data); |
279 | - final route = _getPage<T>(arguments); | 305 | + final route = _getRouteDecoder<T>(arguments); |
280 | if (route == null) return null; | 306 | if (route == null) return null; |
281 | _popWithResult(); | 307 | _popWithResult(); |
282 | - return _push<T>(arguments, route); | 308 | + return _push<T>(route); |
283 | } | 309 | } |
284 | 310 | ||
285 | @override | 311 | @override |
@@ -290,15 +316,15 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -290,15 +316,15 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
290 | ]) async { | 316 | ]) async { |
291 | final arguments = _buildPageSettings(page, data); | 317 | final arguments = _buildPageSettings(page, data); |
292 | 318 | ||
293 | - final route = _getPage<T>(arguments); | 319 | + final route = _getRouteDecoder<T>(arguments); |
294 | 320 | ||
295 | if (route == null) return null; | 321 | if (route == null) return null; |
296 | 322 | ||
297 | - while (_activePages.isNotEmpty && !predicate(_activePages.last)) { | 323 | + while (_activePages.isNotEmpty && !predicate(_activePages.last.route!)) { |
298 | _popWithResult(); | 324 | _popWithResult(); |
299 | } | 325 | } |
300 | 326 | ||
301 | - return _push<T>(arguments, route); | 327 | + return _push<T>(route); |
302 | } | 328 | } |
303 | 329 | ||
304 | @override | 330 | @override |
@@ -312,7 +338,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -312,7 +338,7 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
312 | assert(() { | 338 | assert(() { |
313 | if (!canBack) { | 339 | if (!canBack) { |
314 | final last = _activePages.last; | 340 | final last = _activePages.last; |
315 | - final name = last.name; | 341 | + final name = last.route?.name; |
316 | throw 'The page $name cannot be popped'; | 342 | throw 'The page $name cannot be popped'; |
317 | } | 343 | } |
318 | return true; | 344 | return true; |
@@ -323,15 +349,15 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -323,15 +349,15 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
323 | Future<R?> backAndtoNamed<T, R>(String page, | 349 | Future<R?> backAndtoNamed<T, R>(String page, |
324 | {T? result, Object? data}) async { | 350 | {T? result, Object? data}) async { |
325 | final arguments = _buildPageSettings(page, data); | 351 | final arguments = _buildPageSettings(page, data); |
326 | - final route = _getPage<R>(arguments); | 352 | + final route = _getRouteDecoder<R>(arguments); |
327 | if (route == null) return null; | 353 | if (route == null) return null; |
328 | _popWithResult<T>(result); | 354 | _popWithResult<T>(result); |
329 | - return _push<R>(arguments, route); | 355 | + return _push<R>(route); |
330 | } | 356 | } |
331 | 357 | ||
332 | @override | 358 | @override |
333 | void backUntil(bool Function(GetPage) predicate) { | 359 | void backUntil(bool Function(GetPage) predicate) { |
334 | - while (canBack && !predicate(_activePages.last)) { | 360 | + while (canBack && !predicate(_activePages.last.route!)) { |
335 | _popWithResult(); | 361 | _popWithResult(); |
336 | } | 362 | } |
337 | 363 | ||
@@ -341,10 +367,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -341,10 +367,11 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
341 | @override | 367 | @override |
342 | void goToUnknownPage([bool clearPages = false]) { | 368 | void goToUnknownPage([bool clearPages = false]) { |
343 | if (clearPages) _activePages.clear(); | 369 | if (clearPages) _activePages.clear(); |
344 | - final page = | ||
345 | - _buildSettings(_unknownPage, _buildPageSettings(_unknownPage.name)); | ||
346 | - _activePages.add(page); | ||
347 | - refresh(); | 370 | + |
371 | + final pageSettings = _buildPageSettings(_unknownPage.name); | ||
372 | + final routeDecoder = _getRouteDecoder(pageSettings); | ||
373 | + | ||
374 | + _push(routeDecoder!); | ||
348 | } | 375 | } |
349 | 376 | ||
350 | @override | 377 | @override |
@@ -364,28 +391,28 @@ class GetNavigation extends RouterDelegate<PageSettings> | @@ -364,28 +391,28 @@ class GetNavigation extends RouterDelegate<PageSettings> | ||
364 | key: navigatorKey, | 391 | key: navigatorKey, |
365 | restorationScopeId: restorationScopeId, | 392 | restorationScopeId: restorationScopeId, |
366 | observers: navigatorObservers, | 393 | observers: navigatorObservers, |
367 | - pages: List.unmodifiable(_activePages), | 394 | + pages: _activePages.map((decoder) => decoder.route!).toList(), |
368 | onPopPage: _onPopPage, | 395 | onPopPage: _onPopPage, |
369 | ); | 396 | ); |
370 | } | 397 | } |
371 | 398 | ||
372 | @override | 399 | @override |
373 | - Future<void> setNewRoutePath(PageSettings configuration) async { | 400 | + Future<void> setNewRoutePath(RouteDecoder configuration) async { |
374 | // if (_activePages.isEmpty) return; | 401 | // if (_activePages.isEmpty) return; |
375 | - final page = _getPage(configuration); | 402 | + final page = configuration.route; |
376 | if (page == null) { | 403 | if (page == null) { |
377 | goToUnknownPage(); | 404 | goToUnknownPage(); |
378 | return; | 405 | return; |
379 | } else { | 406 | } else { |
380 | - _push(configuration, page); | 407 | + _push(configuration); |
381 | } | 408 | } |
382 | } | 409 | } |
383 | 410 | ||
384 | @override | 411 | @override |
385 | - PageSettings? get currentConfiguration { | 412 | + RouteDecoder? get currentConfiguration { |
386 | if (_activePages.isEmpty) { | 413 | if (_activePages.isEmpty) { |
387 | return null; | 414 | return null; |
388 | } | 415 | } |
389 | - return _activePages.last.arguments as PageSettings; | 416 | + return _activePages.last; |
390 | } | 417 | } |
391 | } | 418 | } |
@@ -2,8 +2,9 @@ import 'package:flutter/foundation.dart'; | @@ -2,8 +2,9 @@ import 'package:flutter/foundation.dart'; | ||
2 | import 'package:flutter/widgets.dart'; | 2 | import 'package:flutter/widgets.dart'; |
3 | 3 | ||
4 | import '../../../../get.dart'; | 4 | import '../../../../get.dart'; |
5 | +import '../../root/parse_route.dart'; | ||
5 | 6 | ||
6 | -class NewGetInformationParser extends RouteInformationParser<PageSettings> { | 7 | +class NewGetInformationParser extends RouteInformationParser<RouteDecoder> { |
7 | final String initialRoute; | 8 | final String initialRoute; |
8 | 9 | ||
9 | NewGetInformationParser({ | 10 | NewGetInformationParser({ |
@@ -12,7 +13,7 @@ class NewGetInformationParser extends RouteInformationParser<PageSettings> { | @@ -12,7 +13,7 @@ class NewGetInformationParser extends RouteInformationParser<PageSettings> { | ||
12 | Get.log('GetInformationParser is created !'); | 13 | Get.log('GetInformationParser is created !'); |
13 | } | 14 | } |
14 | @override | 15 | @override |
15 | - SynchronousFuture<PageSettings> parseRouteInformation( | 16 | + SynchronousFuture<RouteDecoder> parseRouteInformation( |
16 | RouteInformation routeInformation, | 17 | RouteInformation routeInformation, |
17 | ) { | 18 | ) { |
18 | var location = routeInformation.location; | 19 | var location = routeInformation.location; |
@@ -26,19 +27,27 @@ class NewGetInformationParser extends RouteInformationParser<PageSettings> { | @@ -26,19 +27,27 @@ class NewGetInformationParser extends RouteInformationParser<PageSettings> { | ||
26 | 27 | ||
27 | Get.log('GetInformationParser: route location: $location'); | 28 | Get.log('GetInformationParser: route location: $location'); |
28 | 29 | ||
29 | - // final matchResult = Get.routeTree.matchRoute(location ?? initialRoute); | 30 | + final routeName = location ?? initialRoute; |
30 | 31 | ||
31 | - return SynchronousFuture( | ||
32 | - PageSettings( | ||
33 | - Uri.parse(location!), | ||
34 | - ), | 32 | + return SynchronousFuture(_locationToRouteDecoder(routeName)); |
33 | + } | ||
34 | + | ||
35 | + RouteDecoder _locationToRouteDecoder(String location) { | ||
36 | + var uri = Uri.parse(location); | ||
37 | + final args = PageSettings(uri); | ||
38 | + final decoder = Get.routeTree.matchRoute(location, arguments: args); | ||
39 | + decoder.route = decoder.route?.copy( | ||
40 | + completer: null, | ||
41 | + arguments: args, | ||
42 | + parameters: args.params, | ||
35 | ); | 43 | ); |
44 | + return decoder; | ||
36 | } | 45 | } |
37 | 46 | ||
38 | @override | 47 | @override |
39 | - RouteInformation restoreRouteInformation(PageSettings config) { | 48 | + RouteInformation restoreRouteInformation(RouteDecoder config) { |
40 | return RouteInformation( | 49 | return RouteInformation( |
41 | - location: config.name, | 50 | + location: config.arguments?.name, |
42 | state: null, | 51 | state: null, |
43 | ); | 52 | ); |
44 | } | 53 | } |
1 | import 'package:flutter/widgets.dart'; | 1 | import 'package:flutter/widgets.dart'; |
2 | 2 | ||
3 | extension PageArgExt on BuildContext { | 3 | extension PageArgExt on BuildContext { |
4 | - PageSettings get arguments { | ||
5 | - return ModalRoute.of(this)!.settings.arguments as PageSettings; | 4 | + RouteSettings? get settings { |
5 | + return ModalRoute.of(this)!.settings; | ||
6 | + } | ||
7 | + | ||
8 | + PageSettings? get pageSettings { | ||
9 | + final args = ModalRoute.of(this)?.settings.arguments; | ||
10 | + if (args is PageSettings) { | ||
11 | + return args; | ||
12 | + } | ||
13 | + return null; | ||
14 | + } | ||
15 | + | ||
16 | + dynamic get arguments { | ||
17 | + final args = settings?.arguments; | ||
18 | + if (args is PageSettings) { | ||
19 | + return args.arguments; | ||
20 | + } else { | ||
21 | + return args; | ||
22 | + } | ||
23 | + } | ||
24 | + | ||
25 | + Map<String, String> get params { | ||
26 | + final args = settings?.arguments; | ||
27 | + if (args is PageSettings) { | ||
28 | + return args.params; | ||
29 | + } else { | ||
30 | + return {}; | ||
31 | + } | ||
32 | + } | ||
33 | + | ||
34 | + Router get router { | ||
35 | + return Router.of(this); | ||
36 | + } | ||
37 | + | ||
38 | + String get location { | ||
39 | + final parser = router.routeInformationParser; | ||
40 | + final config = delegate.currentConfiguration; | ||
41 | + return parser?.restoreRouteInformation(config)?.location ?? '/'; | ||
42 | + } | ||
43 | + | ||
44 | + RouterDelegate get delegate { | ||
45 | + return router.routerDelegate; | ||
6 | } | 46 | } |
7 | } | 47 | } |
8 | 48 |
1 | import '../../get_navigation.dart'; | 1 | import '../../get_navigation.dart'; |
2 | 2 | ||
3 | -class RouteDecoder<T> { | ||
4 | - final List<GetPage<T>> treeBranch; | ||
5 | - GetPage<T>? get route => treeBranch.isEmpty ? null : treeBranch.last; | ||
6 | - final Map<String, String> parameters; | ||
7 | - final Object? arguments; | 3 | +class RouteDecoder { |
8 | const RouteDecoder( | 4 | const RouteDecoder( |
9 | - this.treeBranch, | ||
10 | - this.parameters, | 5 | + this.currentTreeBranch, |
11 | this.arguments, | 6 | this.arguments, |
12 | ); | 7 | ); |
13 | - void replaceArguments(Object? arguments) { | ||
14 | - final _route = route; | ||
15 | - if (_route != null) { | ||
16 | - final index = treeBranch.indexOf(_route); | ||
17 | - treeBranch[index] = _route.copy(arguments: arguments); | 8 | + final List<GetPage> currentTreeBranch; |
9 | + final PageSettings? arguments; | ||
10 | + | ||
11 | + GetPage? get route => | ||
12 | + currentTreeBranch.isEmpty ? null : currentTreeBranch.last; | ||
13 | + | ||
14 | + GetPage routeOrUnknown(GetPage onUnknow) => | ||
15 | + currentTreeBranch.isEmpty ? onUnknow : currentTreeBranch.last; | ||
16 | + | ||
17 | + set route(GetPage? getPage) { | ||
18 | + if (getPage == null) return; | ||
19 | + if (currentTreeBranch.isEmpty) { | ||
20 | + currentTreeBranch.add(getPage); | ||
21 | + } else { | ||
22 | + currentTreeBranch[currentTreeBranch.length - 1] = getPage; | ||
18 | } | 23 | } |
19 | } | 24 | } |
20 | 25 | ||
21 | - void replaceParameters(Object? arguments) { | 26 | + List<GetPage>? get currentChildrens => route?.children; |
27 | + | ||
28 | + Map<String, String> get parameters => arguments?.params ?? {}; | ||
29 | + | ||
30 | + void replaceArguments(Object? arguments) { | ||
22 | final _route = route; | 31 | final _route = route; |
23 | if (_route != null) { | 32 | if (_route != null) { |
24 | - final index = treeBranch.indexOf(_route); | ||
25 | - treeBranch[index] = _route.copy(parameters: parameters); | 33 | + final index = currentTreeBranch.indexOf(_route); |
34 | + currentTreeBranch[index] = _route.copy(arguments: arguments); | ||
26 | } | 35 | } |
27 | } | 36 | } |
28 | } | 37 | } |
@@ -34,7 +43,7 @@ class ParseRouteTree { | @@ -34,7 +43,7 @@ class ParseRouteTree { | ||
34 | 43 | ||
35 | final List<GetPage> routes; | 44 | final List<GetPage> routes; |
36 | 45 | ||
37 | - RouteDecoder matchRoute(String name, {Object? arguments}) { | 46 | + RouteDecoder matchRoute(String name, {PageSettings? arguments}) { |
38 | final uri = Uri.parse(name); | 47 | final uri = Uri.parse(name); |
39 | // /home/profile/123 => home,profile,123 => /,/home,/home/profile,/home/profile/123 | 48 | // /home/profile/123 => home,profile,123 => /,/home,/home/profile,/home/profile/123 |
40 | final split = uri.path.split('/').where((element) => element.isNotEmpty); | 49 | final split = uri.path.split('/').where((element) => element.isNotEmpty); |
@@ -77,41 +86,44 @@ class ParseRouteTree { | @@ -77,41 +86,44 @@ class ParseRouteTree { | ||
77 | ), | 86 | ), |
78 | ) | 87 | ) |
79 | .toList(); | 88 | .toList(); |
89 | + arguments?.params.clear(); | ||
90 | + arguments?.params.addAll(params); | ||
80 | return RouteDecoder( | 91 | return RouteDecoder( |
81 | mappedTreeBranch, | 92 | mappedTreeBranch, |
82 | - params, | ||
83 | arguments, | 93 | arguments, |
84 | ); | 94 | ); |
85 | } | 95 | } |
86 | 96 | ||
97 | + arguments?.params.clear(); | ||
98 | + arguments?.params.addAll(params); | ||
99 | + | ||
87 | //route not found | 100 | //route not found |
88 | return RouteDecoder( | 101 | return RouteDecoder( |
89 | treeBranch.map((e) => e.value).toList(), | 102 | treeBranch.map((e) => e.value).toList(), |
90 | - params, | ||
91 | arguments, | 103 | arguments, |
92 | ); | 104 | ); |
93 | } | 105 | } |
94 | 106 | ||
95 | - void addRoutes(List<GetPage> getPages) { | 107 | + void addRoutes<T>(List<GetPage<T>> getPages) { |
96 | for (final route in getPages) { | 108 | for (final route in getPages) { |
97 | addRoute(route); | 109 | addRoute(route); |
98 | } | 110 | } |
99 | } | 111 | } |
100 | 112 | ||
101 | - void removeRoutes(List<GetPage> getPages) { | 113 | + void removeRoutes<T>(List<GetPage<T>> getPages) { |
102 | for (final route in getPages) { | 114 | for (final route in getPages) { |
103 | removeRoute(route); | 115 | removeRoute(route); |
104 | } | 116 | } |
105 | } | 117 | } |
106 | 118 | ||
107 | - void removeRoute(GetPage route) { | 119 | + void removeRoute<T>(GetPage<T> route) { |
108 | routes.remove(route); | 120 | routes.remove(route); |
109 | for (var page in _flattenPage(route)) { | 121 | for (var page in _flattenPage(route)) { |
110 | removeRoute(page); | 122 | removeRoute(page); |
111 | } | 123 | } |
112 | } | 124 | } |
113 | 125 | ||
114 | - void addRoute(GetPage route) { | 126 | + void addRoute<T>(GetPage<T> route) { |
115 | routes.add(route); | 127 | routes.add(route); |
116 | 128 | ||
117 | // Add Page children. | 129 | // Add Page children. |
@@ -165,9 +177,11 @@ class ParseRouteTree { | @@ -165,9 +177,11 @@ class ParseRouteTree { | ||
165 | ); | 177 | ); |
166 | 178 | ||
167 | GetPage? _findRoute(String name) { | 179 | GetPage? _findRoute(String name) { |
168 | - return routes.firstWhereOrNull( | 180 | + final value = routes.firstWhereOrNull( |
169 | (route) => route.path.regex.hasMatch(name), | 181 | (route) => route.path.regex.hasMatch(name), |
170 | ); | 182 | ); |
183 | + | ||
184 | + return value; | ||
171 | } | 185 | } |
172 | 186 | ||
173 | Map<String, String> _parseParams(String path, PathDecoded routePath) { | 187 | Map<String, String> _parseParams(String path, PathDecoded routePath) { |
@@ -98,7 +98,7 @@ class GetPage<T> extends Page<T> { | @@ -98,7 +98,7 @@ class GetPage<T> extends Page<T> { | ||
98 | Duration? transitionDuration, | 98 | Duration? transitionDuration, |
99 | bool? fullscreenDialog, | 99 | bool? fullscreenDialog, |
100 | RouteSettings? settings, | 100 | RouteSettings? settings, |
101 | - List<GetPage>? children, | 101 | + List<GetPage<T>>? children, |
102 | GetPage? unknownRoute, | 102 | GetPage? unknownRoute, |
103 | List<GetMiddleware>? middlewares, | 103 | List<GetMiddleware>? middlewares, |
104 | bool? preventDuplicates, | 104 | bool? preventDuplicates, |
-
Please register or login to post a comment