Toggle navigation
Toggle navigation
This project
Loading...
Sign in
flutter_package
/
fluttertpc_get
Go to a project
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Ahmed Fwela
2021-06-13 12:42:25 +0200
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
f3eb8cc43974f1ab2f3ed2bc807258c517d9c267
f3eb8cc4
1 parent
7bcdd135
fixed parameter parsing and middleware sorting
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
85 additions
and
66 deletions
lib/get_navigation/src/root/parse_route.dart
lib/get_navigation/src/routes/route_middleware.dart
test/navigation/parse_route_test.dart
lib/get_navigation/src/root/parse_route.dart
View file @
f3eb8cc
...
...
@@ -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
,
);
...
...
lib/get_navigation/src/routes/route_middleware.dart
View file @
f3eb8cc
...
...
@@ -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
...
...
test/navigation/parse_route_test.dart
View file @
f3eb8cc
...
...
@@ -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'
,
()
{
...
...
Please
register
or
login
to post a comment