Jonatas

use constraints rather map on parser

@@ -47,11 +47,14 @@ class ParseRouteTree { @@ -47,11 +47,14 @@ class ParseRouteTree {
47 // Add Parent middlewares to children 47 // Add Parent middlewares to children
48 final pageMiddlewares = page.middlewares ?? <GetMiddleware>[]; 48 final pageMiddlewares = page.middlewares ?? <GetMiddleware>[];
49 pageMiddlewares.addAll(route.middlewares ?? <GetMiddleware>[]); 49 pageMiddlewares.addAll(route.middlewares ?? <GetMiddleware>[]);
50 - result.add(_addChild(page, parentPath, pageMiddlewares)); 50 + result.add(_addChild(page, parentPath, pageMiddlewares));
  51 + page.bindings.addAll(route.bindings);
  52 +
51 final children = _flattenPage(page); 53 final children = _flattenPage(page);
52 for (var child in children) { 54 for (var child in children) {
53 pageMiddlewares.addAll(child.middlewares ?? <GetMiddleware>[]); 55 pageMiddlewares.addAll(child.middlewares ?? <GetMiddleware>[]);
54 result.add(_addChild(child, parentPath, pageMiddlewares)); 56 result.add(_addChild(child, parentPath, pageMiddlewares));
  57 + page.bindings.addAll(route.bindings);
55 } 58 }
56 } 59 }
57 return result; 60 return result;
@@ -85,7 +88,7 @@ class ParseRouteTree { @@ -85,7 +88,7 @@ class ParseRouteTree {
85 (route) { 88 (route) {
86 return _match( 89 return _match(
87 name, 90 name,
88 - route.path['regex'] as RegExp, 91 + route.path.regex,
89 ); 92 );
90 }, 93 },
91 orElse: () => null, 94 orElse: () => null,
@@ -94,18 +97,13 @@ class ParseRouteTree { @@ -94,18 +97,13 @@ class ParseRouteTree {
94 return route; 97 return route;
95 } 98 }
96 99
97 - Map<String, String> _parseParams(  
98 - String path, Map<String, dynamic> routePath) { 100 + Map<String, String> _parseParams(String path, PathDecoded routePath) {
99 final params = <String, String>{}; 101 final params = <String, String>{};
100 - Match paramsMatch = (routePath['regex'] as RegExp).firstMatch(path);  
101 - for (var i = 0; i < (routePath['keys'].length as int); i++) {  
102 - String param;  
103 - try {  
104 - param = Uri.decodeQueryComponent(paramsMatch[i + 1]);  
105 - } on Exception catch (_) {  
106 - param = paramsMatch[i + 1];  
107 - }  
108 - params[routePath['keys'][i] as String] = param; 102 + Match paramsMatch = routePath.regex.firstMatch(path);
  103 +
  104 + for (var i = 0; i < routePath.keys.length; i++) {
  105 + var param = Uri.decodeQueryComponent(paramsMatch[i + 1]);
  106 + params[routePath.keys[i]] = param;
109 } 107 }
110 return params; 108 return params;
111 } 109 }
@@ -11,27 +11,27 @@ import 'default_transitions.dart'; @@ -11,27 +11,27 @@ import 'default_transitions.dart';
11 import 'transitions_type.dart'; 11 import 'transitions_type.dart';
12 12
13 class GetPageRoute<T> extends PageRoute<T> { 13 class GetPageRoute<T> extends PageRoute<T> {
14 - GetPageRoute(  
15 - {RouteSettings settings,  
16 - this.transitionDuration = const Duration(milliseconds: 300),  
17 - this.opaque = true,  
18 - this.parameter,  
19 - this.curve,  
20 - this.alignment,  
21 - this.transition,  
22 - this.popGesture,  
23 - this.customTransition,  
24 - this.barrierDismissible = false,  
25 - this.barrierColor,  
26 - this.binding,  
27 - this.bindings,  
28 - this.routeName,  
29 - this.page,  
30 - this.barrierLabel,  
31 - this.maintainState = true,  
32 - bool fullscreenDialog = false,  
33 - this.middlewares})  
34 - : assert(opaque != null), 14 + GetPageRoute({
  15 + RouteSettings settings,
  16 + this.transitionDuration = const Duration(milliseconds: 300),
  17 + this.opaque = true,
  18 + this.parameter,
  19 + this.curve,
  20 + this.alignment,
  21 + this.transition,
  22 + this.popGesture,
  23 + this.customTransition,
  24 + this.barrierDismissible = false,
  25 + this.barrierColor,
  26 + this.binding,
  27 + this.bindings,
  28 + this.routeName,
  29 + this.page,
  30 + this.barrierLabel,
  31 + this.maintainState = true,
  32 + bool fullscreenDialog = false,
  33 + this.middlewares,
  34 + }) : assert(opaque != null),
35 assert(barrierDismissible != null), 35 assert(barrierDismissible != null),
36 assert(maintainState != null), 36 assert(maintainState != null),
37 assert(fullscreenDialog != null), 37 assert(fullscreenDialog != null),
@@ -5,6 +5,12 @@ import '../../get_navigation.dart'; @@ -5,6 +5,12 @@ import '../../get_navigation.dart';
5 import 'custom_transition.dart'; 5 import 'custom_transition.dart';
6 import 'transitions_type.dart'; 6 import 'transitions_type.dart';
7 7
  8 +class PathDecoded {
  9 + const PathDecoded(this.regex, this.keys);
  10 + final RegExp regex;
  11 + final List<String> keys;
  12 +}
  13 +
8 class GetPage { 14 class GetPage {
9 final String name; 15 final String name;
10 final GetPageBuilder page; 16 final GetPageBuilder page;
@@ -24,8 +30,8 @@ class GetPage { @@ -24,8 +30,8 @@ class GetPage {
24 final RouteSettings settings; 30 final RouteSettings settings;
25 final List<GetPage> children; 31 final List<GetPage> children;
26 final List<GetMiddleware> middlewares; 32 final List<GetMiddleware> middlewares;
27 - final Map<String, dynamic> path;  
28 - final List<String> keys; 33 + final PathDecoded path;
  34 +
29 GetPage({ 35 GetPage({
30 @required this.name, 36 @required this.name,
31 @required this.page, 37 @required this.page,
@@ -39,43 +45,37 @@ class GetPage { @@ -39,43 +45,37 @@ class GetPage {
39 this.transitionDuration, 45 this.transitionDuration,
40 this.popGesture, 46 this.popGesture,
41 this.binding, 47 this.binding,
42 - this.bindings, 48 + this.bindings = const [],
43 this.transition, 49 this.transition,
44 this.customTransition, 50 this.customTransition,
45 this.fullscreenDialog = false, 51 this.fullscreenDialog = false,
46 this.children, 52 this.children,
47 - this.keys,  
48 this.middlewares, 53 this.middlewares,
49 - }) : path = normalize(name, keysList: keys), 54 + }) : path = _nameToRegex(name),
50 assert(page != null), 55 assert(page != null),
51 assert(name != null), 56 assert(name != null),
52 assert(maintainState != null), 57 assert(maintainState != null),
53 assert(fullscreenDialog != null); 58 assert(fullscreenDialog != null);
54 59
55 - static Map<String, dynamic> normalize(  
56 - String path, {  
57 - List<String> keysList,  
58 - }) {  
59 - var keys = List<String>.from(keysList ?? const <String>[]);  
60 - var stringPath =  
61 - '$path/?'.replaceAllMapped(RegExp(r'(\.)?:(\w+)(\?)?'), (placeholder) {  
62 - var replace = StringBuffer('(?:'); 60 + static PathDecoded _nameToRegex(String path) {
  61 + var keys = <String>[];
63 62
64 - if (placeholder[1] != null) {  
65 - replace.write('\.');  
66 - } 63 + String _replace(Match pattern) {
  64 + var buffer = StringBuffer('(?:');
67 65
68 - replace.write('([\\w%+-._~!\$&\'()*,;=:@]+))'); 66 + if (pattern[1] != null) buffer.write('\.');
  67 + buffer.write('([\\w%+-._~!\$&\'()*,;=:@]+))');
  68 + if (pattern[3] != null) buffer.write('?');
69 69
70 - if (placeholder[3] != null) {  
71 - replace.write('?');  
72 - } 70 + keys.add(pattern[2]);
  71 + return "$buffer";
  72 + }
73 73
74 - keys.add(placeholder[2]);  
75 - return replace.toString();  
76 - }).replaceAll('//', '/'); 74 + var stringPath = '$path/?'
  75 + .replaceAllMapped(RegExp(r'(\.)?:(\w+)(\?)?'), _replace)
  76 + .replaceAll('//', '/');
77 77
78 - return {'regex': RegExp('^$stringPath\$'), 'keys': keys}; 78 + return PathDecoded(RegExp('^$stringPath\$'), keys);
79 } 79 }
80 80
81 GetPage copyWith({ 81 GetPage copyWith({
@@ -95,7 +95,6 @@ class GetPage { @@ -95,7 +95,6 @@ class GetPage {
95 Duration transitionDuration, 95 Duration transitionDuration,
96 bool fullscreenDialog, 96 bool fullscreenDialog,
97 RouteSettings settings, 97 RouteSettings settings,
98 - List<String> keys,  
99 List<GetPage> children, 98 List<GetPage> children,
100 List<GetMiddleware> middlewares, 99 List<GetMiddleware> middlewares,
101 }) { 100 }) {
@@ -116,7 +115,6 @@ class GetPage { @@ -116,7 +115,6 @@ class GetPage {
116 transitionDuration: transitionDuration ?? this.transitionDuration, 115 transitionDuration: transitionDuration ?? this.transitionDuration,
117 fullscreenDialog: fullscreenDialog ?? this.fullscreenDialog, 116 fullscreenDialog: fullscreenDialog ?? this.fullscreenDialog,
118 settings: settings ?? this.settings, 117 settings: settings ?? this.settings,
119 - keys: keys ?? this.keys,  
120 children: children ?? this.children, 118 children: children ?? this.children,
121 middlewares: middlewares ?? this.middlewares, 119 middlewares: middlewares ?? this.middlewares,
122 ); 120 );
@@ -102,8 +102,6 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> @@ -102,8 +102,6 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>>
102 VoidCallback remove; 102 VoidCallback remove;
103 Object _selector; 103 Object _selector;
104 104
105 - List<VoidCallback> _removeToOthers = <VoidCallback>[];  
106 -  
107 @override 105 @override
108 void initState() { 106 void initState() {
109 super.initState(); 107 super.initState();