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