Showing
3 changed files
with
85 additions
and
66 deletions
| @@ -38,21 +38,25 @@ class ParseRouteTree { | @@ -38,21 +38,25 @@ class ParseRouteTree { | ||
| 38 | final treeBranch = cumulativePaths | 38 | final treeBranch = cumulativePaths |
| 39 | .map((e) => MapEntry(e, _findRoute(e))) | 39 | .map((e) => MapEntry(e, _findRoute(e))) |
| 40 | .where((element) => element.value != null) | 40 | .where((element) => element.value != null) |
| 41 | + .map((e) => MapEntry(e.key, e.value!)) | ||
| 41 | .toList(); | 42 | .toList(); |
| 42 | 43 | ||
| 43 | final params = Map<String, String>.from(uri.queryParameters); | 44 | final params = Map<String, String>.from(uri.queryParameters); |
| 44 | if (treeBranch.isNotEmpty) { | 45 | if (treeBranch.isNotEmpty) { |
| 45 | //route is found, do further parsing to get nested query params | 46 | //route is found, do further parsing to get nested query params |
| 46 | final lastRoute = treeBranch.last; | 47 | final lastRoute = treeBranch.last; |
| 47 | - final parsedParams = _parseParams(name, lastRoute.value!.path); | 48 | + final parsedParams = _parseParams(name, lastRoute.value.path); |
| 48 | if (parsedParams.isNotEmpty) { | 49 | if (parsedParams.isNotEmpty) { |
| 49 | params.addAll(parsedParams); | 50 | params.addAll(parsedParams); |
| 50 | } | 51 | } |
| 51 | //copy parameters to all pages. | 52 | //copy parameters to all pages. |
| 52 | final mappedTreeBranch = treeBranch | 53 | final mappedTreeBranch = treeBranch |
| 53 | .map( | 54 | .map( |
| 54 | - (e) => e.value!.copy( | ||
| 55 | - parameter: params, | 55 | + (e) => e.value.copy( |
| 56 | + parameter: { | ||
| 57 | + if (e.value.parameter != null) ...e.value.parameter!, | ||
| 58 | + ...params, | ||
| 59 | + }, | ||
| 56 | name: e.key, | 60 | name: e.key, |
| 57 | ), | 61 | ), |
| 58 | ) | 62 | ) |
| @@ -65,7 +69,7 @@ class ParseRouteTree { | @@ -65,7 +69,7 @@ class ParseRouteTree { | ||
| 65 | 69 | ||
| 66 | //route not found | 70 | //route not found |
| 67 | return RouteDecoder( | 71 | return RouteDecoder( |
| 68 | - treeBranch.map((e) => e.value!).toList(), | 72 | + treeBranch.map((e) => e.value).toList(), |
| 69 | params, | 73 | params, |
| 70 | ); | 74 | ); |
| 71 | } | 75 | } |
| @@ -125,8 +129,7 @@ class ParseRouteTree { | @@ -125,8 +129,7 @@ class ParseRouteTree { | ||
| 125 | opaque: origin.opaque, | 129 | opaque: origin.opaque, |
| 126 | parameter: origin.parameter, | 130 | parameter: origin.parameter, |
| 127 | popGesture: origin.popGesture, | 131 | popGesture: origin.popGesture, |
| 128 | - | ||
| 129 | - // settings: origin.settings, | 132 | + preventDuplicates: origin.preventDuplicates, |
| 130 | transitionDuration: origin.transitionDuration, | 133 | transitionDuration: origin.transitionDuration, |
| 131 | middlewares: middlewares, | 134 | middlewares: middlewares, |
| 132 | ); | 135 | ); |
| @@ -104,16 +104,16 @@ class MiddlewareRunner { | @@ -104,16 +104,16 @@ class MiddlewareRunner { | ||
| 104 | 104 | ||
| 105 | final List<GetMiddleware>? _middlewares; | 105 | final List<GetMiddleware>? _middlewares; |
| 106 | 106 | ||
| 107 | - List<GetMiddleware>? _getMiddlewares() { | ||
| 108 | - if (_middlewares != null) { | ||
| 109 | - _middlewares!.sort((a, b) => a.priority!.compareTo(b.priority!)); | ||
| 110 | - return _middlewares; | ||
| 111 | - } | ||
| 112 | - return <GetMiddleware>[]; | 107 | + List<GetMiddleware> _getMiddlewares() { |
| 108 | + final _m = _middlewares ?? <GetMiddleware>[]; | ||
| 109 | + return _m | ||
| 110 | + ..sort( | ||
| 111 | + (a, b) => (a.priority ?? 0).compareTo(b.priority ?? 0), | ||
| 112 | + ); | ||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | GetPage? runOnPageCalled(GetPage? page) { | 115 | GetPage? runOnPageCalled(GetPage? page) { |
| 116 | - _getMiddlewares()?.forEach((element) { | 116 | + _getMiddlewares().forEach((element) { |
| 117 | page = element.onPageCalled(page); | 117 | page = element.onPageCalled(page); |
| 118 | }); | 118 | }); |
| 119 | return page; | 119 | return page; |
| @@ -121,7 +121,7 @@ class MiddlewareRunner { | @@ -121,7 +121,7 @@ class MiddlewareRunner { | ||
| 121 | 121 | ||
| 122 | RouteSettings? runRedirect(String? route) { | 122 | RouteSettings? runRedirect(String? route) { |
| 123 | RouteSettings? to; | 123 | RouteSettings? to; |
| 124 | - _getMiddlewares()?.forEach((element) { | 124 | + _getMiddlewares().forEach((element) { |
| 125 | to = element.redirect(route); | 125 | to = element.redirect(route); |
| 126 | }); | 126 | }); |
| 127 | if (to != null) { | 127 | if (to != null) { |
| @@ -131,28 +131,28 @@ class MiddlewareRunner { | @@ -131,28 +131,28 @@ class MiddlewareRunner { | ||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | List<Bindings>? runOnBindingsStart(List<Bindings>? bindings) { | 133 | List<Bindings>? runOnBindingsStart(List<Bindings>? bindings) { |
| 134 | - _getMiddlewares()?.forEach((element) { | 134 | + _getMiddlewares().forEach((element) { |
| 135 | bindings = element.onBindingsStart(bindings); | 135 | bindings = element.onBindingsStart(bindings); |
| 136 | }); | 136 | }); |
| 137 | return bindings; | 137 | return bindings; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | GetPageBuilder? runOnPageBuildStart(GetPageBuilder? page) { | 140 | GetPageBuilder? runOnPageBuildStart(GetPageBuilder? page) { |
| 141 | - _getMiddlewares()?.forEach((element) { | 141 | + _getMiddlewares().forEach((element) { |
| 142 | page = element.onPageBuildStart(page); | 142 | page = element.onPageBuildStart(page); |
| 143 | }); | 143 | }); |
| 144 | return page; | 144 | return page; |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | Widget runOnPageBuilt(Widget page) { | 147 | Widget runOnPageBuilt(Widget page) { |
| 148 | - _getMiddlewares()?.forEach((element) { | 148 | + _getMiddlewares().forEach((element) { |
| 149 | page = element.onPageBuilt(page); | 149 | page = element.onPageBuilt(page); |
| 150 | }); | 150 | }); |
| 151 | return page; | 151 | return page; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | void runOnPageDispose() => | 154 | void runOnPageDispose() => |
| 155 | - _getMiddlewares()?.forEach((element) => element.onPageDispose()); | 155 | + _getMiddlewares().forEach((element) => element.onPageDispose()); |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | class PageRedirect { | 158 | class PageRedirect { |
| @@ -161,46 +161,38 @@ class PageRedirect { | @@ -161,46 +161,38 @@ class PageRedirect { | ||
| 161 | RouteSettings settings; | 161 | RouteSettings settings; |
| 162 | bool isUnknown; | 162 | bool isUnknown; |
| 163 | 163 | ||
| 164 | - PageRedirect(this.settings, this.unknownRoute, | ||
| 165 | - {this.isUnknown = false, this.route}); | 164 | + PageRedirect( |
| 165 | + this.settings, | ||
| 166 | + this.unknownRoute, { | ||
| 167 | + this.isUnknown = false, | ||
| 168 | + this.route, | ||
| 169 | + }); | ||
| 166 | 170 | ||
| 167 | // redirect all pages that needes redirecting | 171 | // redirect all pages that needes redirecting |
| 168 | GetPageRoute<T> page<T>() { | 172 | GetPageRoute<T> page<T>() { |
| 169 | while (needRecheck()) {} | 173 | while (needRecheck()) {} |
| 170 | - return isUnknown | ||
| 171 | - ? GetPageRoute<T>( | ||
| 172 | - page: unknownRoute!.page, | ||
| 173 | - parameter: unknownRoute!.parameter, | ||
| 174 | - settings: RouteSettings( | ||
| 175 | - name: unknownRoute!.name, arguments: settings.arguments), | ||
| 176 | - curve: unknownRoute!.curve, | ||
| 177 | - opaque: unknownRoute!.opaque, | ||
| 178 | - customTransition: unknownRoute!.customTransition, | ||
| 179 | - binding: unknownRoute!.binding, | ||
| 180 | - bindings: unknownRoute!.bindings, | ||
| 181 | - transitionDuration: (unknownRoute!.transitionDuration ?? | ||
| 182 | - Get.defaultTransitionDuration), | ||
| 183 | - transition: unknownRoute!.transition, | ||
| 184 | - popGesture: unknownRoute!.popGesture, | ||
| 185 | - fullscreenDialog: unknownRoute!.fullscreenDialog, | ||
| 186 | - middlewares: unknownRoute!.middlewares, | ||
| 187 | - ) | ||
| 188 | - : GetPageRoute<T>( | ||
| 189 | - page: route!.page, | ||
| 190 | - routeName: route!.name, | ||
| 191 | - parameter: route!.parameter, | ||
| 192 | - settings: settings, | ||
| 193 | - curve: route!.curve, | ||
| 194 | - opaque: route!.opaque, | ||
| 195 | - customTransition: route!.customTransition, | ||
| 196 | - binding: route!.binding, | ||
| 197 | - bindings: route!.bindings, | ||
| 198 | - transitionDuration: | ||
| 199 | - (route!.transitionDuration ?? Get.defaultTransitionDuration), | ||
| 200 | - transition: route!.transition, | ||
| 201 | - popGesture: route!.popGesture, | ||
| 202 | - fullscreenDialog: route!.fullscreenDialog, | ||
| 203 | - middlewares: route!.middlewares); | 174 | + final _r = (isUnknown ? unknownRoute : route)!; |
| 175 | + return GetPageRoute<T>( | ||
| 176 | + page: _r.page, | ||
| 177 | + parameter: _r.parameter, | ||
| 178 | + settings: isUnknown | ||
| 179 | + ? RouteSettings( | ||
| 180 | + name: _r.name, | ||
| 181 | + arguments: settings.arguments, | ||
| 182 | + ) | ||
| 183 | + : settings, | ||
| 184 | + curve: _r.curve, | ||
| 185 | + opaque: _r.opaque, | ||
| 186 | + customTransition: _r.customTransition, | ||
| 187 | + binding: _r.binding, | ||
| 188 | + bindings: _r.bindings, | ||
| 189 | + transitionDuration: | ||
| 190 | + _r.transitionDuration ?? Get.defaultTransitionDuration, | ||
| 191 | + transition: _r.transition, | ||
| 192 | + popGesture: _r.popGesture, | ||
| 193 | + fullscreenDialog: _r.fullscreenDialog, | ||
| 194 | + middlewares: _r.middlewares, | ||
| 195 | + ); | ||
| 204 | } | 196 | } |
| 205 | 197 | ||
| 206 | /// check if redirect is needed | 198 | /// check if redirect is needed |
| @@ -5,19 +5,39 @@ import 'package:get/get_navigation/src/root/parse_route.dart'; | @@ -5,19 +5,39 @@ 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 pageTree = GetPage(name: '/city', page: () => Container(), children: [ | ||
| 9 | - GetPage(name: '/home', page: () => Container(), children: [ | ||
| 10 | - GetPage(name: '/bed-room', page: () => Container()), | ||
| 11 | - GetPage(name: '/living-room', page: () => Container()), | ||
| 12 | - ]), | ||
| 13 | - GetPage(name: '/work', page: () => Container(), children: [ | ||
| 14 | - GetPage(name: '/office', page: () => Container(), children: [ | ||
| 15 | - GetPage(name: '/pen', page: () => Container()), | ||
| 16 | - GetPage(name: '/paper', page: () => Container()), | 8 | + final testParams = {'hi': 'value'}; |
| 9 | + final pageTree = GetPage( | ||
| 10 | + name: '/city', | ||
| 11 | + page: () => Container(), | ||
| 12 | + children: [ | ||
| 13 | + GetPage(name: '/home', page: () => Container(), children: [ | ||
| 14 | + GetPage(name: '/bed-room', page: () => Container()), | ||
| 15 | + GetPage(name: '/living-room', page: () => Container()), | ||
| 17 | ]), | 16 | ]), |
| 18 | - GetPage(name: '/meeting-room', page: () => Container()), | ||
| 19 | - ]), | ||
| 20 | - ]); | 17 | + GetPage( |
| 18 | + name: '/work', | ||
| 19 | + page: () => Container(), | ||
| 20 | + children: [ | ||
| 21 | + GetPage( | ||
| 22 | + name: '/office', | ||
| 23 | + page: () => Container(), | ||
| 24 | + children: [ | ||
| 25 | + GetPage( | ||
| 26 | + name: '/pen', | ||
| 27 | + page: () => Container(), | ||
| 28 | + parameter: testParams, | ||
| 29 | + ), | ||
| 30 | + GetPage(name: '/paper', page: () => Container()), | ||
| 31 | + ], | ||
| 32 | + ), | ||
| 33 | + GetPage( | ||
| 34 | + name: '/meeting-room', | ||
| 35 | + page: () => Container(), | ||
| 36 | + ), | ||
| 37 | + ], | ||
| 38 | + ), | ||
| 39 | + ], | ||
| 40 | + ); | ||
| 21 | 41 | ||
| 22 | final tree = ParseRouteTree(routes: <GetPage>[]); | 42 | final tree = ParseRouteTree(routes: <GetPage>[]); |
| 23 | 43 | ||
| @@ -28,6 +48,10 @@ void main() { | @@ -28,6 +48,10 @@ void main() { | ||
| 28 | final match = tree.matchRoute(searchRoute); | 48 | final match = tree.matchRoute(searchRoute); |
| 29 | expect(match, isNotNull); | 49 | expect(match, isNotNull); |
| 30 | expect(match.route!.name, searchRoute); | 50 | expect(match.route!.name, searchRoute); |
| 51 | + final testRouteParam = match.route!.parameter!; | ||
| 52 | + for (final tParam in testParams.entries) { | ||
| 53 | + expect(testRouteParam[tParam.key], tParam.value); | ||
| 54 | + } | ||
| 31 | }); | 55 | }); |
| 32 | 56 | ||
| 33 | test('Parse Page without children', () { | 57 | test('Parse Page without children', () { |
-
Please register or login to post a comment