Jonny Borges
Committed by GitHub

Merge pull request #1539 from Bdaya-Dev/master

fixed parameter parsing and middleware sorting
@@ -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', () {