Schaban

Add children to GetPage

... ... @@ -5,10 +5,9 @@ class ParseRouteTree {
final List<_ParseRouteTreeNode> _nodes = <_ParseRouteTreeNode>[];
// bool _hasDefaultRoute = false;
void addRoute(GetPage route) {
var path = route.name;
if (path == Navigator.defaultRouteName) {
// if (_hasDefaultRoute) {
// throw ("Default route was already defined");
... ... @@ -46,8 +45,50 @@ class ParseRouteTree {
}
parent = node;
}
// Add Page children.
for (var page in _flattenPage(route)) {
addRoute(page);
}
}
List<GetPage> _flattenPage(GetPage route) {
final result = <GetPage>[];
if (route.pages == null || route.pages.isEmpty) {
return result;
}
final routePath = route.name;
for (var page in route.pages) {
result.add(_changePath(page, routePath));
final children = _flattenPage(page);
for (var child in children) {
result.add(_changePath(child, routePath));
}
}
return result;
}
/// Change the Path for a [GetPage]
GetPage _changePath(GetPage orgin, String routePath) => GetPage(
name: routePath + orgin.name,
page: orgin.page,
title: orgin.title,
alignment: orgin.alignment,
transition: orgin.transition,
binding: orgin.binding,
bindings: orgin.bindings,
curve: orgin.curve,
customTransition: orgin.customTransition,
fullscreenDialog: orgin.fullscreenDialog,
maintainState: orgin.maintainState,
opaque: orgin.opaque,
parameter: orgin.parameter,
popGesture: orgin.popGesture,
settings: orgin.settings,
transitionDuration: orgin.transitionDuration,
);
_GetPageMatch matchRoute(String path) {
var usePath = path;
if (usePath.startsWith("/")) {
... ... @@ -126,9 +167,7 @@ class ParseRouteTree {
var match = matches.first;
var nodeToUse = match.node;
if (nodeToUse != null &&
nodeToUse.routes != null &&
nodeToUse.routes.length > 0) {
if (nodeToUse != null && nodeToUse.routes != null && nodeToUse.routes.length > 0) {
var routes = nodeToUse.routes;
var routeMatch = _GetPageMatch(routes[0]);
... ... @@ -186,8 +225,7 @@ class ParseRouteTree {
class _ParseRouteTreeNodeMatch {
_ParseRouteTreeNodeMatch(this.node);
_ParseRouteTreeNodeMatch.fromMatch(
_ParseRouteTreeNodeMatch match, this.node) {
_ParseRouteTreeNodeMatch.fromMatch(_ParseRouteTreeNodeMatch match, this.node) {
parameters = <String, String>{};
if (match != null) {
parameters.addAll(match.parameters);
... ...
... ... @@ -20,6 +20,7 @@ class GetPage {
final Duration transitionDuration;
final bool fullscreenDialog;
final RouteSettings settings;
final List<GetPage> pages;
const GetPage({
@required this.name,
... ... @@ -38,6 +39,7 @@ class GetPage {
this.transition,
this.customTransition,
this.fullscreenDialog = false,
this.pages,
}) : assert(page != null),
assert(name != null),
assert(maintainState != null),
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import 'package:get/get_navigation/src/root/parse_route.dart';
void main() {
test('Parse Page with children', () {
final tree = ParseRouteTree();
final pageTree = GetPage(name: '/city', page: () => Container(), pages: [
GetPage(name: '/home', page: () => Container(), pages: [
GetPage(name: '/bed-room', page: () => Container()),
GetPage(name: '/living-room', page: () => Container()),
]),
GetPage(name: '/work', page: () => Container(), pages: [
GetPage(name: '/office', page: () => Container(), pages: [
GetPage(name: '/pen', page: () => Container()),
GetPage(name: '/paper', page: () => Container()),
]),
GetPage(name: '/meeting-room', page: () => Container()),
]),
]);
tree.addRoute(pageTree);
final searchRoute = '/city/work/office/pen';
final match = tree.matchRoute(searchRoute);
expect(match, isNotNull);
expect(match.route.name, searchRoute);
});
test('Parse Page without children', () {
final tree = ParseRouteTree();
final pageTree = [
GetPage(name: '/city', page: () => Container()),
GetPage(name: '/city/home', page: () => Container()),
GetPage(name: '/city/home/bed-room', page: () => Container()),
GetPage(name: '/city/home/living-room', page: () => Container()),
GetPage(name: '/city/work', page: () => Container()),
GetPage(name: '/city/work/office', page: () => Container()),
GetPage(name: '/city/work/office/pen', page: () => Container()),
GetPage(name: '/city/work/office/paper', page: () => Container()),
GetPage(name: '/city/work/meeting-room', page: () => Container()),
];
for (var p in pageTree) {
tree.addRoute(p);
}
final searchRoute = '/city/work/office/pen';
final match = tree.matchRoute(searchRoute);
expect(match, isNotNull);
expect(match.route.name, searchRoute);
});
}
... ...