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 {
final treeBranch = cumulativePaths
.map((e) => MapEntry(e, _findRoute(e)))
.where((element) => element.value != null)
.map((e) => MapEntry(e.key, e.value!))
.toList();
final params = Map<String, String>.from(uri.queryParameters);
if (treeBranch.isNotEmpty) {
//route is found, do further parsing to get nested query params
final lastRoute = treeBranch.last;
final parsedParams = _parseParams(name, lastRoute.value!.path);
final parsedParams = _parseParams(name, lastRoute.value.path);
if (parsedParams.isNotEmpty) {
params.addAll(parsedParams);
}
//copy parameters to all pages.
final mappedTreeBranch = treeBranch
.map(
(e) => e.value!.copy(
parameter: params,
(e) => e.value.copy(
parameter: {
if (e.value.parameter != null) ...e.value.parameter!,
...params,
},
name: e.key,
),
)
... ... @@ -65,7 +69,7 @@ class ParseRouteTree {
//route not found
return RouteDecoder(
treeBranch.map((e) => e.value!).toList(),
treeBranch.map((e) => e.value).toList(),
params,
);
}
... ... @@ -125,8 +129,7 @@ class ParseRouteTree {
opaque: origin.opaque,
parameter: origin.parameter,
popGesture: origin.popGesture,
// settings: origin.settings,
preventDuplicates: origin.preventDuplicates,
transitionDuration: origin.transitionDuration,
middlewares: middlewares,
);
... ...
... ... @@ -104,16 +104,16 @@ class MiddlewareRunner {
final List<GetMiddleware>? _middlewares;
List<GetMiddleware>? _getMiddlewares() {
if (_middlewares != null) {
_middlewares!.sort((a, b) => a.priority!.compareTo(b.priority!));
return _middlewares;
}
return <GetMiddleware>[];
List<GetMiddleware> _getMiddlewares() {
final _m = _middlewares ?? <GetMiddleware>[];
return _m
..sort(
(a, b) => (a.priority ?? 0).compareTo(b.priority ?? 0),
);
}
GetPage? runOnPageCalled(GetPage? page) {
_getMiddlewares()?.forEach((element) {
_getMiddlewares().forEach((element) {
page = element.onPageCalled(page);
});
return page;
... ... @@ -121,7 +121,7 @@ class MiddlewareRunner {
RouteSettings? runRedirect(String? route) {
RouteSettings? to;
_getMiddlewares()?.forEach((element) {
_getMiddlewares().forEach((element) {
to = element.redirect(route);
});
if (to != null) {
... ... @@ -131,28 +131,28 @@ class MiddlewareRunner {
}
List<Bindings>? runOnBindingsStart(List<Bindings>? bindings) {
_getMiddlewares()?.forEach((element) {
_getMiddlewares().forEach((element) {
bindings = element.onBindingsStart(bindings);
});
return bindings;
}
GetPageBuilder? runOnPageBuildStart(GetPageBuilder? page) {
_getMiddlewares()?.forEach((element) {
_getMiddlewares().forEach((element) {
page = element.onPageBuildStart(page);
});
return page;
}
Widget runOnPageBuilt(Widget page) {
_getMiddlewares()?.forEach((element) {
_getMiddlewares().forEach((element) {
page = element.onPageBuilt(page);
});
return page;
}
void runOnPageDispose() =>
_getMiddlewares()?.forEach((element) => element.onPageDispose());
_getMiddlewares().forEach((element) => element.onPageDispose());
}
class PageRedirect {
... ... @@ -161,46 +161,38 @@ class PageRedirect {
RouteSettings settings;
bool isUnknown;
PageRedirect(this.settings, this.unknownRoute,
{this.isUnknown = false, this.route});
PageRedirect(
this.settings,
this.unknownRoute, {
this.isUnknown = false,
this.route,
});
// redirect all pages that needes redirecting
GetPageRoute<T> page<T>() {
while (needRecheck()) {}
return isUnknown
? GetPageRoute<T>(
page: unknownRoute!.page,
parameter: unknownRoute!.parameter,
settings: RouteSettings(
name: unknownRoute!.name, arguments: settings.arguments),
curve: unknownRoute!.curve,
opaque: unknownRoute!.opaque,
customTransition: unknownRoute!.customTransition,
binding: unknownRoute!.binding,
bindings: unknownRoute!.bindings,
transitionDuration: (unknownRoute!.transitionDuration ??
Get.defaultTransitionDuration),
transition: unknownRoute!.transition,
popGesture: unknownRoute!.popGesture,
fullscreenDialog: unknownRoute!.fullscreenDialog,
middlewares: unknownRoute!.middlewares,
)
: GetPageRoute<T>(
page: route!.page,
routeName: route!.name,
parameter: route!.parameter,
settings: settings,
curve: route!.curve,
opaque: route!.opaque,
customTransition: route!.customTransition,
binding: route!.binding,
bindings: route!.bindings,
transitionDuration:
(route!.transitionDuration ?? Get.defaultTransitionDuration),
transition: route!.transition,
popGesture: route!.popGesture,
fullscreenDialog: route!.fullscreenDialog,
middlewares: route!.middlewares);
final _r = (isUnknown ? unknownRoute : route)!;
return GetPageRoute<T>(
page: _r.page,
parameter: _r.parameter,
settings: isUnknown
? RouteSettings(
name: _r.name,
arguments: settings.arguments,
)
: settings,
curve: _r.curve,
opaque: _r.opaque,
customTransition: _r.customTransition,
binding: _r.binding,
bindings: _r.bindings,
transitionDuration:
_r.transitionDuration ?? Get.defaultTransitionDuration,
transition: _r.transition,
popGesture: _r.popGesture,
fullscreenDialog: _r.fullscreenDialog,
middlewares: _r.middlewares,
);
}
/// check if redirect is needed
... ...
... ... @@ -5,19 +5,39 @@ import 'package:get/get_navigation/src/root/parse_route.dart';
void main() {
test('Parse Page with children', () {
final pageTree = GetPage(name: '/city', page: () => Container(), children: [
GetPage(name: '/home', page: () => Container(), children: [
GetPage(name: '/bed-room', page: () => Container()),
GetPage(name: '/living-room', page: () => Container()),
]),
GetPage(name: '/work', page: () => Container(), children: [
GetPage(name: '/office', page: () => Container(), children: [
GetPage(name: '/pen', page: () => Container()),
GetPage(name: '/paper', page: () => Container()),
final testParams = {'hi': 'value'};
final pageTree = GetPage(
name: '/city',
page: () => Container(),
children: [
GetPage(name: '/home', page: () => Container(), children: [
GetPage(name: '/bed-room', page: () => Container()),
GetPage(name: '/living-room', page: () => Container()),
]),
GetPage(name: '/meeting-room', page: () => Container()),
]),
]);
GetPage(
name: '/work',
page: () => Container(),
children: [
GetPage(
name: '/office',
page: () => Container(),
children: [
GetPage(
name: '/pen',
page: () => Container(),
parameter: testParams,
),
GetPage(name: '/paper', page: () => Container()),
],
),
GetPage(
name: '/meeting-room',
page: () => Container(),
),
],
),
],
);
final tree = ParseRouteTree(routes: <GetPage>[]);
... ... @@ -28,6 +48,10 @@ void main() {
final match = tree.matchRoute(searchRoute);
expect(match, isNotNull);
expect(match.route!.name, searchRoute);
final testRouteParam = match.route!.parameter!;
for (final tParam in testParams.entries) {
expect(testRouteParam[tParam.key], tParam.value);
}
});
test('Parse Page without children', () {
... ...