Jonny Borges

fix parameters on initialRoute

@@ -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,