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