Showing
8 changed files
with
408 additions
and
73 deletions
1 | +import 'package:flutter/foundation.dart'; | ||
1 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
2 | import 'package:get/get.dart'; | 3 | import 'package:get/get.dart'; |
4 | + | ||
3 | import 'lang/translation_service.dart'; | 5 | import 'lang/translation_service.dart'; |
4 | import 'routes/app_pages.dart'; | 6 | import 'routes/app_pages.dart'; |
5 | import 'shared/logger/logger_utils.dart'; | 7 | import 'shared/logger/logger_utils.dart'; |
@@ -25,3 +27,108 @@ class MyApp extends StatelessWidget { | @@ -25,3 +27,108 @@ class MyApp extends StatelessWidget { | ||
25 | ); | 27 | ); |
26 | } | 28 | } |
27 | } | 29 | } |
30 | + | ||
31 | +// Navigator 2 example, WIP | ||
32 | +// TODO: add all methods from NavigatorExtension to GetNav | ||
33 | + | ||
34 | +// class MyApp extends StatelessWidget { | ||
35 | +// MyApp({Key? key}) : super(key: key); | ||
36 | + | ||
37 | +// final getNav = Get.put( | ||
38 | +// GetNav(pages: [ | ||
39 | +// GetPage(name: '/first', page: () => First()), | ||
40 | +// GetPage(name: '/second', page: () => Second()), | ||
41 | +// GetPage(name: '/third', page: () => Third()), | ||
42 | +// ]), | ||
43 | +// ); | ||
44 | + | ||
45 | +// @override | ||
46 | +// Widget build(BuildContext context) { | ||
47 | +// return GetMaterialApp.router( | ||
48 | +// debugShowCheckedModeBanner: false, | ||
49 | +// routeInformationParser: getNav.routeInformationParser, | ||
50 | +// routerDelegate: getNav.routerDelegate, | ||
51 | +// ); | ||
52 | +// } | ||
53 | +// } | ||
54 | + | ||
55 | +// class First extends StatelessWidget { | ||
56 | +// final GetNav getNav = Get.find(); | ||
57 | + | ||
58 | +// @override | ||
59 | +// Widget build(BuildContext context) { | ||
60 | +// return Scaffold( | ||
61 | +// appBar: AppBar( | ||
62 | +// title: Text('page one'), | ||
63 | +// leading: IconButton( | ||
64 | +// icon: Icon(Icons.more), | ||
65 | +// onPressed: () { | ||
66 | +// Get.changeTheme( | ||
67 | +// context.isDarkMode ? ThemeData.light() : ThemeData.dark()); | ||
68 | +// }, | ||
69 | +// ), | ||
70 | +// ), | ||
71 | +// body: Center( | ||
72 | +// child: Container( | ||
73 | +// height: 300, | ||
74 | +// width: 300, | ||
75 | +// child: ElevatedButton( | ||
76 | +// onPressed: () { | ||
77 | +// getNav.toNamed('/second?id=584305'); | ||
78 | +// }, | ||
79 | +// child: Text('next screen'), | ||
80 | +// ), | ||
81 | +// ), | ||
82 | +// ), | ||
83 | +// ); | ||
84 | +// } | ||
85 | +// } | ||
86 | + | ||
87 | +// class Second extends StatelessWidget { | ||
88 | +// final GetNav getNav = Get.find(); | ||
89 | +// @override | ||
90 | +// Widget build(BuildContext context) { | ||
91 | +// return Scaffold( | ||
92 | +// appBar: AppBar( | ||
93 | +// title: Text('page two ${Get.parameters["id"]}'), | ||
94 | +// ), | ||
95 | +// body: Center( | ||
96 | +// child: Container( | ||
97 | +// height: 300, | ||
98 | +// width: 300, | ||
99 | +// child: ElevatedButton( | ||
100 | +// onPressed: () { | ||
101 | +// getNav.toNamed('/third'); | ||
102 | +// }, | ||
103 | +// child: Text('next screen'), | ||
104 | +// ), | ||
105 | +// ), | ||
106 | +// ), | ||
107 | +// ); | ||
108 | +// } | ||
109 | +// } | ||
110 | + | ||
111 | +// class Third extends StatelessWidget { | ||
112 | +// final GetNav getNav = Get.find(); | ||
113 | +// @override | ||
114 | +// Widget build(BuildContext context) { | ||
115 | +// return Scaffold( | ||
116 | +// backgroundColor: Colors.red, | ||
117 | +// appBar: AppBar( | ||
118 | +// title: Text('page three'), | ||
119 | +// ), | ||
120 | +// body: Center( | ||
121 | +// child: Container( | ||
122 | +// height: 300, | ||
123 | +// width: 300, | ||
124 | +// child: ElevatedButton( | ||
125 | +// onPressed: () { | ||
126 | +// getNav.offUntil('/first'); | ||
127 | +// }, | ||
128 | +// child: Text('go to first screen'), | ||
129 | +// ), | ||
130 | +// ), | ||
131 | +// ), | ||
132 | +// ); | ||
133 | +// } | ||
134 | +// } |
@@ -30,10 +30,6 @@ dependencies: | @@ -30,10 +30,6 @@ dependencies: | ||
30 | path: ../ | 30 | path: ../ |
31 | #get_test: ^3.13.3 | 31 | #get_test: ^3.13.3 |
32 | 32 | ||
33 | -dependency_overrides: | ||
34 | - get: | ||
35 | - path: ../ | ||
36 | - | ||
37 | dev_dependencies: | 33 | dev_dependencies: |
38 | flutter_test: | 34 | flutter_test: |
39 | sdk: flutter | 35 | sdk: flutter |
@@ -936,16 +936,18 @@ you can only use widgets and widget functions here'''; | @@ -936,16 +936,18 @@ you can only use widgets and widget functions here'''; | ||
936 | predicate ?? (route) => false); | 936 | predicate ?? (route) => false); |
937 | } | 937 | } |
938 | 938 | ||
939 | + void registerList(List<GetPage> getPages) { | ||
940 | + routeTree = ParseRouteTree(routes: getPages); | ||
941 | + } | ||
942 | + | ||
939 | void addPages(List<GetPage>? getPages) { | 943 | void addPages(List<GetPage>? getPages) { |
940 | if (getPages != null) { | 944 | if (getPages != null) { |
941 | - routeTree = ParseRouteTree(); | ||
942 | - | ||
943 | - routeTree.addRoutes(getPages); | 945 | + registerList(getPages); |
944 | } | 946 | } |
945 | } | 947 | } |
946 | 948 | ||
947 | void addPage(GetPage getPage) { | 949 | void addPage(GetPage getPage) { |
948 | - routeTree = ParseRouteTree(); | 950 | + // routeTree = ParseRouteTree(); |
949 | routeTree.addRoute(getPage); | 951 | routeTree.addRoute(getPage); |
950 | } | 952 | } |
951 | 953 |
1 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
2 | import 'package:flutter/foundation.dart'; | 2 | import 'package:flutter/foundation.dart'; |
3 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
4 | + | ||
4 | import '../../../get_core/get_core.dart'; | 5 | import '../../../get_core/get_core.dart'; |
5 | import '../../../get_instance/get_instance.dart'; | 6 | import '../../../get_instance/get_instance.dart'; |
6 | import '../../../get_state_manager/get_state_manager.dart'; | 7 | import '../../../get_state_manager/get_state_manager.dart'; |
8 | +import '../../../get_state_manager/src/simple/list_notifier.dart'; | ||
7 | import '../../../get_utils/get_utils.dart'; | 9 | import '../../../get_utils/get_utils.dart'; |
8 | import '../../get_navigation.dart'; | 10 | import '../../get_navigation.dart'; |
9 | import 'root_controller.dart'; | 11 | import 'root_controller.dart'; |
@@ -313,63 +315,204 @@ class GetMaterialApp extends StatelessWidget { | @@ -313,63 +315,204 @@ class GetMaterialApp extends StatelessWidget { | ||
313 | )); | 315 | )); |
314 | } | 316 | } |
315 | 317 | ||
316 | -class GetNavigator extends StatelessWidget { | ||
317 | - final List<GetPage> getPages; | ||
318 | - | ||
319 | - const GetNavigator( | ||
320 | - {Key? key, | ||
321 | - required this.getPages, | ||
322 | - this.pages = const <Page<dynamic>>[], | ||
323 | - this.onPopPage, | ||
324 | - this.initialRoute, | ||
325 | - this.onGenerateInitialRoutes = Navigator.defaultGenerateInitialRoutes, | ||
326 | - this.onGenerateRoute, | ||
327 | - this.onUnknownRoute, | ||
328 | - this.transitionDelegate = const DefaultTransitionDelegate<dynamic>(), | ||
329 | - this.reportsRouteUpdateToEngine = false, | ||
330 | - this.observers = const <NavigatorObserver>[], | ||
331 | - this.restorationScopeId, | ||
332 | - this.unKnownRoute}) | ||
333 | - : super(key: key); | 318 | +class GetInformationParser extends RouteInformationParser<GetPage> { |
319 | + @override | ||
320 | + SynchronousFuture<GetPage> parseRouteInformation( | ||
321 | + RouteInformation routeInformation) { | ||
322 | + if (routeInformation.location == '/') { | ||
323 | + return SynchronousFuture(Get.routeTree.routes.first); | ||
324 | + } | ||
325 | + print('route location: ${routeInformation.location}'); | ||
326 | + final page = Get.routeTree.matchRoute(routeInformation.location!); | ||
327 | + print(page.parameters); | ||
328 | + final val = page.route!.copy( | ||
329 | + name: routeInformation.location, | ||
330 | + parameter: Map.from(page.parameters), | ||
331 | + ); | ||
332 | + return SynchronousFuture(val); | ||
333 | + } | ||
334 | 334 | ||
335 | - final List<Page<dynamic>> pages; | 335 | + @override |
336 | + RouteInformation restoreRouteInformation(GetPage uri) { | ||
337 | + print('restore $uri'); | ||
336 | 338 | ||
337 | - final GetPage? unKnownRoute; | 339 | + return RouteInformation(location: uri.name); |
340 | + } | ||
341 | +} | ||
338 | 342 | ||
339 | - final PopPageCallback? onPopPage; | 343 | +class GetNav { |
344 | + GetNav({GetDelegate? routerDelegate, required this.pages}) | ||
345 | + : routerDelegate = routerDelegate ?? GetDelegate() { | ||
346 | + Get.registerList(pages); | ||
347 | + Get.addKey(this.routerDelegate.navigatorKey); | ||
348 | + } | ||
340 | 349 | ||
341 | - final TransitionDelegate<dynamic> transitionDelegate; | 350 | + Future<T?> toNamed<T>(String route) { |
351 | + return routerDelegate.toNamed(route); | ||
352 | + } | ||
342 | 353 | ||
343 | - final String? initialRoute; | 354 | + Future<T?> pushRoute<T>( |
355 | + GetPage route, { | ||
356 | + bool removeUntil = false, | ||
357 | + bool replaceCurrent = false, | ||
358 | + bool rebuildStack = true, | ||
359 | + }) { | ||
360 | + return routerDelegate.pushRoute(route, | ||
361 | + removeUntil: removeUntil, | ||
362 | + replaceCurrent: replaceCurrent, | ||
363 | + rebuildStack: rebuildStack); | ||
364 | + } | ||
344 | 365 | ||
345 | - final RouteFactory? onGenerateRoute; | 366 | + Future<bool> popRoute() { |
367 | + return routerDelegate.popRoute(); | ||
368 | + } | ||
346 | 369 | ||
347 | - final RouteFactory? onUnknownRoute; | 370 | + Future<T?> offUntil<T>(String route) { |
371 | + return routerDelegate.offUntil(route); | ||
372 | + } | ||
348 | 373 | ||
349 | - final List<NavigatorObserver> observers; | 374 | + final GetDelegate routerDelegate; |
375 | + final GetInformationParser routeInformationParser = GetInformationParser(); | ||
376 | + final List<GetPage> pages; | ||
377 | +} | ||
350 | 378 | ||
351 | - final String? restorationScopeId; | 379 | +class GetDelegate extends RouterDelegate<GetPage> |
380 | + with | ||
381 | + // ignore: prefer_mixin | ||
382 | + ListNotifier, | ||
383 | + PopNavigatorRouterDelegateMixin<GetPage> { | ||
384 | + final List<GetPage> routes = <GetPage>[]; | ||
352 | 385 | ||
353 | - static const String defaultRouteName = '/'; | 386 | + final GetPage? notFoundRoute; |
354 | 387 | ||
355 | - final RouteListFactory onGenerateInitialRoutes; | 388 | + final List<NavigatorObserver>? dipNavObservers; |
389 | + final TransitionDelegate<dynamic>? transitionDelegate; | ||
356 | 390 | ||
357 | - final bool reportsRouteUpdateToEngine; | 391 | + GetDelegate( |
392 | + {this.notFoundRoute, this.dipNavObservers, this.transitionDelegate}); | ||
358 | 393 | ||
394 | + /// Called by the [Router] at startup with the structure that the | ||
395 | + /// [RouteInformationParser] obtained from parsing the initial route. | ||
359 | @override | 396 | @override |
360 | - Widget build(Object context) { | 397 | + Widget build(BuildContext context) { |
361 | return Navigator( | 398 | return Navigator( |
362 | - pages: getPages, | ||
363 | - onPopPage: onPopPage, | ||
364 | - initialRoute: initialRoute, | ||
365 | - onGenerateInitialRoutes: onGenerateInitialRoutes, | ||
366 | - onGenerateRoute: onGenerateRoute, | ||
367 | - onUnknownRoute: onUnknownRoute, | ||
368 | - transitionDelegate: transitionDelegate, | ||
369 | - reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, | ||
370 | - observers: observers, | ||
371 | - restorationScopeId: restorationScopeId, | ||
372 | - key: Get.nestedKey(key), | 399 | + key: navigatorKey, |
400 | + onPopPage: _onPopPage, | ||
401 | + pages: routes.toList(), | ||
402 | + observers: [GetObserver()], | ||
403 | + transitionDelegate: | ||
404 | + transitionDelegate ?? const DefaultTransitionDelegate<dynamic>(), | ||
405 | + ); | ||
406 | + } | ||
407 | + | ||
408 | + @override | ||
409 | + final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); | ||
410 | + | ||
411 | + @override | ||
412 | + Future<void> setInitialRoutePath(GetPage configuration) async { | ||
413 | + return pushRoute(configuration); | ||
414 | + } | ||
415 | + | ||
416 | + @override | ||
417 | + Future<void> setNewRoutePath(GetPage configuration) { | ||
418 | + routes.clear(); | ||
419 | + return pushRoute(configuration); | ||
420 | + } | ||
421 | + | ||
422 | + /// Called by the [Router] when it detects a route information may have | ||
423 | + /// changed as a result of rebuild. | ||
424 | + @override | ||
425 | + GetPage get currentConfiguration { | ||
426 | + final route = routes.last; | ||
427 | + return route; | ||
428 | + } | ||
429 | + | ||
430 | + Future<T?> toNamed<T>(String route) { | ||
431 | + final page = Get.routeTree.matchRoute(route); | ||
432 | + if (page.route != null) { | ||
433 | + return pushRoute(page.route!.copy(name: route)); | ||
434 | + } else { | ||
435 | + return pushRoute(_notFound()); | ||
436 | + } | ||
437 | + } | ||
438 | + | ||
439 | + Future<T?> offUntil<T>(String route) { | ||
440 | + final page = Get.routeTree.matchRoute(route); | ||
441 | + if (page.route != null) { | ||
442 | + return pushRoute(page.route!.copy(name: route), removeUntil: true); | ||
443 | + } else { | ||
444 | + return pushRoute(_notFound()); | ||
445 | + } | ||
446 | + } | ||
447 | + | ||
448 | + GetPage _notFound() { | ||
449 | + return notFoundRoute ?? | ||
450 | + GetPage( | ||
451 | + name: '/404', | ||
452 | + page: () => Scaffold( | ||
453 | + body: Text('not found'), | ||
454 | + ), | ||
455 | + ); | ||
456 | + } | ||
457 | + | ||
458 | + Future<T?> pushRoute<T>( | ||
459 | + GetPage route, { | ||
460 | + bool removeUntil = false, | ||
461 | + bool replaceCurrent = false, | ||
462 | + bool rebuildStack = true, | ||
463 | + }) async { | ||
464 | + route = route.copy(unknownRoute: _notFound()); | ||
465 | + assert(!(removeUntil && replaceCurrent), | ||
466 | + 'Only removeUntil or replaceCurrent should by true!'); | ||
467 | + if (removeUntil) { | ||
468 | + routes.clear(); | ||
469 | + } else if (replaceCurrent && routes.isNotEmpty) { | ||
470 | + routes.removeLast(); | ||
471 | + } | ||
472 | + _addRoute(route); | ||
473 | + if (rebuildStack) { | ||
474 | + refresh(); | ||
475 | + } | ||
476 | + } | ||
477 | + | ||
478 | + @override | ||
479 | + Future<bool> popRoute() { | ||
480 | + if (routes.length > 1) { | ||
481 | + _removePage(routes.last); | ||
482 | + return Future.value(true); | ||
483 | + } | ||
484 | + return Future.value(false); | ||
485 | + } | ||
486 | + | ||
487 | + bool canPop() { | ||
488 | + return routes.isNotEmpty; | ||
489 | + } | ||
490 | + | ||
491 | + bool _onPopPage(Route<dynamic> route, dynamic result) { | ||
492 | + final didPop = route.didPop(result); | ||
493 | + if (!didPop) { | ||
494 | + return false; | ||
495 | + } | ||
496 | + routes.remove(route.settings); | ||
497 | + refresh(); | ||
498 | + return true; | ||
499 | + } | ||
500 | + | ||
501 | + void _removePage(GetPage page) { | ||
502 | + routes.remove(page); | ||
503 | + | ||
504 | + refresh(); | ||
505 | + } | ||
506 | + | ||
507 | + void _addRoute(GetPage route) { | ||
508 | + routes.add( | ||
509 | + route, | ||
373 | ); | 510 | ); |
511 | + refresh(); | ||
512 | + } | ||
513 | + | ||
514 | + void addRoutes(List<GetPage> pages) { | ||
515 | + routes.addAll(pages); | ||
516 | + refresh(); | ||
374 | } | 517 | } |
375 | } | 518 | } |
@@ -9,7 +9,11 @@ class RouteDecoder { | @@ -9,7 +9,11 @@ class RouteDecoder { | ||
9 | } | 9 | } |
10 | 10 | ||
11 | class ParseRouteTree { | 11 | class ParseRouteTree { |
12 | - final _routes = <GetPage>[]; | 12 | + ParseRouteTree({ |
13 | + required this.routes, | ||
14 | + }); | ||
15 | + | ||
16 | + final List<GetPage> routes; | ||
13 | 17 | ||
14 | RouteDecoder matchRoute(String name) { | 18 | RouteDecoder matchRoute(String name) { |
15 | final uri = Uri.parse(name); | 19 | final uri = Uri.parse(name); |
@@ -34,7 +38,7 @@ class ParseRouteTree { | @@ -34,7 +38,7 @@ class ParseRouteTree { | ||
34 | } | 38 | } |
35 | 39 | ||
36 | void addRoute(GetPage route) { | 40 | void addRoute(GetPage route) { |
37 | - _routes.add(route); | 41 | + routes.add(route); |
38 | 42 | ||
39 | // Add Page children. | 43 | // Add Page children. |
40 | for (var page in _flattenPage(route)) { | 44 | for (var page in _flattenPage(route)) { |
@@ -82,13 +86,13 @@ class ParseRouteTree { | @@ -82,13 +86,13 @@ class ParseRouteTree { | ||
82 | opaque: origin.opaque, | 86 | opaque: origin.opaque, |
83 | parameter: origin.parameter, | 87 | parameter: origin.parameter, |
84 | popGesture: origin.popGesture, | 88 | popGesture: origin.popGesture, |
85 | - settings: origin.settings, | 89 | + // settings: origin.settings, |
86 | transitionDuration: origin.transitionDuration, | 90 | transitionDuration: origin.transitionDuration, |
87 | middlewares: middlewares, | 91 | middlewares: middlewares, |
88 | ); | 92 | ); |
89 | 93 | ||
90 | GetPage? _findRoute(String name) { | 94 | GetPage? _findRoute(String name) { |
91 | - return _routes.firstWhereOrNull( | 95 | + return routes.firstWhereOrNull( |
92 | (route) => route.path.regex.hasMatch(name), | 96 | (route) => route.path.regex.hasMatch(name), |
93 | ); | 97 | ); |
94 | } | 98 | } |
1 | +import 'package:flutter/foundation.dart'; | ||
2 | +import 'package:flutter/material.dart'; | ||
1 | import 'package:flutter/widgets.dart'; | 3 | import 'package:flutter/widgets.dart'; |
2 | 4 | ||
3 | import '../../../get_core/src/get_main.dart'; | 5 | import '../../../get_core/src/get_main.dart'; |
@@ -6,15 +8,25 @@ import '../../get_navigation.dart'; | @@ -6,15 +8,25 @@ import '../../get_navigation.dart'; | ||
6 | import 'custom_transition.dart'; | 8 | import 'custom_transition.dart'; |
7 | import 'transitions_type.dart'; | 9 | import 'transitions_type.dart'; |
8 | 10 | ||
11 | +@immutable | ||
9 | class PathDecoded { | 12 | class PathDecoded { |
10 | const PathDecoded(this.regex, this.keys); | 13 | const PathDecoded(this.regex, this.keys); |
11 | final RegExp regex; | 14 | final RegExp regex; |
12 | final List<String?> keys; | 15 | final List<String?> keys; |
16 | + | ||
17 | + @override | ||
18 | + bool operator ==(Object other) { | ||
19 | + if (identical(this, other)) return true; | ||
20 | + | ||
21 | + return other is PathDecoded && | ||
22 | + other.regex == regex; // && listEquals(other.keys, keys); | ||
23 | + } | ||
24 | + | ||
25 | + @override | ||
26 | + int get hashCode => regex.hashCode; | ||
13 | } | 27 | } |
14 | 28 | ||
15 | class GetPage<T> extends Page<T> { | 29 | class GetPage<T> extends Page<T> { |
16 | - @override | ||
17 | - final String name; | ||
18 | final GetPageBuilder page; | 30 | final GetPageBuilder page; |
19 | final bool? popGesture; | 31 | final bool? popGesture; |
20 | final Map<String, String>? parameter; | 32 | final Map<String, String>? parameter; |
@@ -29,7 +41,19 @@ class GetPage<T> extends Page<T> { | @@ -29,7 +41,19 @@ class GetPage<T> extends Page<T> { | ||
29 | final CustomTransition? customTransition; | 41 | final CustomTransition? customTransition; |
30 | final Duration? transitionDuration; | 42 | final Duration? transitionDuration; |
31 | final bool fullscreenDialog; | 43 | final bool fullscreenDialog; |
32 | - final RouteSettings? settings; | 44 | + |
45 | + // @override | ||
46 | + // final LocalKey? key; | ||
47 | + | ||
48 | + // @override | ||
49 | + // RouteSettings get settings => this; | ||
50 | + | ||
51 | + @override | ||
52 | + Object? get arguments => Get.arguments; | ||
53 | + | ||
54 | + @override | ||
55 | + final String name; | ||
56 | + | ||
33 | final List<GetPage>? children; | 57 | final List<GetPage>? children; |
34 | final List<GetMiddleware>? middlewares; | 58 | final List<GetMiddleware>? middlewares; |
35 | final PathDecoded path; | 59 | final PathDecoded path; |
@@ -39,7 +63,7 @@ class GetPage<T> extends Page<T> { | @@ -39,7 +63,7 @@ class GetPage<T> extends Page<T> { | ||
39 | required this.name, | 63 | required this.name, |
40 | required this.page, | 64 | required this.page, |
41 | this.title, | 65 | this.title, |
42 | - this.settings, | 66 | + // RouteSettings settings, |
43 | this.maintainState = true, | 67 | this.maintainState = true, |
44 | this.curve = Curves.linear, | 68 | this.curve = Curves.linear, |
45 | this.alignment, | 69 | this.alignment, |
@@ -55,7 +79,13 @@ class GetPage<T> extends Page<T> { | @@ -55,7 +79,13 @@ class GetPage<T> extends Page<T> { | ||
55 | this.children, | 79 | this.children, |
56 | this.middlewares, | 80 | this.middlewares, |
57 | this.unknownRoute, | 81 | this.unknownRoute, |
58 | - }) : path = _nameToRegex(name); | 82 | + }) : path = _nameToRegex(name), |
83 | + super( | ||
84 | + key: ValueKey(name), | ||
85 | + name: name, | ||
86 | + arguments: Get.arguments, | ||
87 | + ); | ||
88 | + // settings = RouteSettings(name: name, arguments: Get.arguments); | ||
59 | 89 | ||
60 | static PathDecoded _nameToRegex(String path) { | 90 | static PathDecoded _nameToRegex(String path) { |
61 | var keys = <String?>[]; | 91 | var keys = <String?>[]; |
@@ -96,6 +126,7 @@ class GetPage<T> extends Page<T> { | @@ -96,6 +126,7 @@ class GetPage<T> extends Page<T> { | ||
96 | bool? fullscreenDialog, | 126 | bool? fullscreenDialog, |
97 | RouteSettings? settings, | 127 | RouteSettings? settings, |
98 | List<GetPage>? children, | 128 | List<GetPage>? children, |
129 | + GetPage? unknownRoute, | ||
99 | List<GetMiddleware>? middlewares, | 130 | List<GetMiddleware>? middlewares, |
100 | }) { | 131 | }) { |
101 | return GetPage( | 132 | return GetPage( |
@@ -114,19 +145,70 @@ class GetPage<T> extends Page<T> { | @@ -114,19 +145,70 @@ class GetPage<T> extends Page<T> { | ||
114 | customTransition: customTransition ?? this.customTransition, | 145 | customTransition: customTransition ?? this.customTransition, |
115 | transitionDuration: transitionDuration ?? this.transitionDuration, | 146 | transitionDuration: transitionDuration ?? this.transitionDuration, |
116 | fullscreenDialog: fullscreenDialog ?? this.fullscreenDialog, | 147 | fullscreenDialog: fullscreenDialog ?? this.fullscreenDialog, |
117 | - settings: settings ?? this.settings, | 148 | + // settings: settings ?? this.settings, |
118 | children: children ?? this.children, | 149 | children: children ?? this.children, |
150 | + unknownRoute: unknownRoute ?? this.unknownRoute, | ||
119 | middlewares: middlewares ?? this.middlewares, | 151 | middlewares: middlewares ?? this.middlewares, |
120 | ); | 152 | ); |
121 | } | 153 | } |
122 | 154 | ||
123 | @override | 155 | @override |
124 | - Object? get arguments => Get.arguments; | ||
125 | - | ||
126 | - @override | ||
127 | Route<T> createRoute(BuildContext context) { | 156 | Route<T> createRoute(BuildContext context) { |
128 | return PageRedirect( | 157 | return PageRedirect( |
129 | - RouteSettings(name: name, arguments: Get.arguments), unknownRoute) | ||
130 | - .page<T>(); | 158 | + this, |
159 | + unknownRoute, | ||
160 | + ).page<T>(); | ||
161 | + } | ||
162 | + | ||
163 | + @override | ||
164 | + bool operator ==(Object other) { | ||
165 | + if (identical(this, other)) return true; | ||
166 | + if (other is GetPage<T>) { | ||
167 | + print(other.path.hashCode == path.hashCode); | ||
168 | + } | ||
169 | + | ||
170 | + return other is GetPage<T> && | ||
171 | + other.page.runtimeType == page.runtimeType && | ||
172 | + other.popGesture == popGesture && | ||
173 | + // mapEquals(other.parameter, parameter) && | ||
174 | + other.title == title && | ||
175 | + other.transition == transition && | ||
176 | + other.curve == curve && | ||
177 | + other.alignment == alignment && | ||
178 | + other.maintainState == maintainState && | ||
179 | + other.opaque == opaque && | ||
180 | + other.binding == binding && | ||
181 | + // listEquals(other.bindings, bindings) && | ||
182 | + other.customTransition == customTransition && | ||
183 | + other.transitionDuration == transitionDuration && | ||
184 | + other.fullscreenDialog == fullscreenDialog && | ||
185 | + other.name == name && | ||
186 | + // listEquals(other.children, children) && | ||
187 | + // listEquals(other.middlewares, middlewares) && | ||
188 | + other.path == path && | ||
189 | + other.unknownRoute == unknownRoute; | ||
190 | + } | ||
191 | + | ||
192 | + @override | ||
193 | + int get hashCode { | ||
194 | + return //page.hashCode ^ | ||
195 | + popGesture.hashCode ^ | ||
196 | + // parameter.hashCode ^ | ||
197 | + title.hashCode ^ | ||
198 | + transition.hashCode ^ | ||
199 | + curve.hashCode ^ | ||
200 | + alignment.hashCode ^ | ||
201 | + maintainState.hashCode ^ | ||
202 | + opaque.hashCode ^ | ||
203 | + binding.hashCode ^ | ||
204 | + // bindings.hashCode ^ | ||
205 | + customTransition.hashCode ^ | ||
206 | + transitionDuration.hashCode ^ | ||
207 | + fullscreenDialog.hashCode ^ | ||
208 | + name.hashCode ^ | ||
209 | + // children.hashCode ^ | ||
210 | + // middlewares.hashCode ^ | ||
211 | + path.hashCode ^ | ||
212 | + unknownRoute.hashCode; | ||
131 | } | 213 | } |
132 | } | 214 | } |
@@ -189,8 +189,7 @@ class PageRedirect { | @@ -189,8 +189,7 @@ class PageRedirect { | ||
189 | page: route!.page, | 189 | page: route!.page, |
190 | routeName: route!.name, | 190 | routeName: route!.name, |
191 | parameter: route!.parameter, | 191 | parameter: route!.parameter, |
192 | - settings: RouteSettings( | ||
193 | - name: settings.name, arguments: settings.arguments), | 192 | + settings: settings, |
194 | curve: route!.curve, | 193 | curve: route!.curve, |
195 | opaque: route!.opaque, | 194 | opaque: route!.opaque, |
196 | customTransition: route!.customTransition, | 195 | customTransition: route!.customTransition, |
@@ -5,7 +5,6 @@ import 'package:get/get_navigation/src/root/parse_route.dart'; | @@ -5,7 +5,6 @@ import 'package:get/get_navigation/src/root/parse_route.dart'; | ||
5 | 5 | ||
6 | void main() { | 6 | void main() { |
7 | test('Parse Page with children', () { | 7 | test('Parse Page with children', () { |
8 | - final tree = ParseRouteTree(); | ||
9 | final pageTree = GetPage(name: '/city', page: () => Container(), children: [ | 8 | final pageTree = GetPage(name: '/city', page: () => Container(), children: [ |
10 | GetPage(name: '/home', page: () => Container(), children: [ | 9 | GetPage(name: '/home', page: () => Container(), children: [ |
11 | GetPage(name: '/bed-room', page: () => Container()), | 10 | GetPage(name: '/bed-room', page: () => Container()), |
@@ -20,7 +19,9 @@ void main() { | @@ -20,7 +19,9 @@ void main() { | ||
20 | ]), | 19 | ]), |
21 | ]); | 20 | ]); |
22 | 21 | ||
23 | - tree.addRoute(pageTree); | 22 | + final tree = ParseRouteTree(routes: <GetPage>[pageTree]); |
23 | + | ||
24 | + // tree.addRoute(pageTree); | ||
24 | final searchRoute = '/city/work/office/pen'; | 25 | final searchRoute = '/city/work/office/pen'; |
25 | final match = tree.matchRoute(searchRoute); | 26 | final match = tree.matchRoute(searchRoute); |
26 | expect(match, isNotNull); | 27 | expect(match, isNotNull); |
@@ -28,7 +29,6 @@ void main() { | @@ -28,7 +29,6 @@ void main() { | ||
28 | }); | 29 | }); |
29 | 30 | ||
30 | test('Parse Page without children', () { | 31 | test('Parse Page without children', () { |
31 | - final tree = ParseRouteTree(); | ||
32 | final pageTree = [ | 32 | final pageTree = [ |
33 | GetPage(name: '/city', page: () => Container()), | 33 | GetPage(name: '/city', page: () => Container()), |
34 | GetPage(name: '/city/home', page: () => Container()), | 34 | GetPage(name: '/city/home', page: () => Container()), |
@@ -41,9 +41,11 @@ void main() { | @@ -41,9 +41,11 @@ void main() { | ||
41 | GetPage(name: '/city/work/meeting-room', page: () => Container()), | 41 | GetPage(name: '/city/work/meeting-room', page: () => Container()), |
42 | ]; | 42 | ]; |
43 | 43 | ||
44 | - for (var p in pageTree) { | ||
45 | - tree.addRoute(p); | ||
46 | - } | 44 | + final tree = ParseRouteTree(routes: pageTree); |
45 | + | ||
46 | + // for (var p in pageTree) { | ||
47 | + // tree.addRoute(p); | ||
48 | + // } | ||
47 | 49 | ||
48 | final searchRoute = '/city/work/office/pen'; | 50 | final searchRoute = '/city/work/office/pen'; |
49 | final match = tree.matchRoute(searchRoute); | 51 | final match = tree.matchRoute(searchRoute); |
-
Please register or login to post a comment