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