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
Jonny Borges
2022-01-21 13:46:22 -0300
Browse Files
Options
Browse Files
Download
Plain Diff
Committed by
GitHub
2022-01-21 13:46:22 -0300
Commit
8867b13fde28274b4d2e6aba34028fdeb0238d6c
8867b13f
2 parents
75658057
d9896173
Merge pull request #2148 from jonataslaw/refactor-nav
try fix middleware
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
91 additions
and
45 deletions
example_nav2/lib/app/middleware/auth_middleware.dart
example_nav2/lib/app/modules/home/views/home_view.dart
example_nav2/lib/app/modules/root/views/root_view.dart
lib/get_navigation/src/extension_navigation.dart
lib/get_navigation/src/root/get_material_app.dart
lib/get_navigation/src/routes/get_router_delegate.dart
lib/get_navigation/src/routes/route_middleware.dart
lib/get_navigation/src/routes/router_outlet.dart
lib/get_state_manager/src/simple/list_notifier.dart
pubspec.yaml
test/navigation/middleware_test.dart
example_nav2/lib/app/middleware/auth_middleware.dart
View file @
8867b13
...
...
@@ -11,12 +11,12 @@ class EnsureAuthMiddleware extends GetMiddleware {
// await Future.delayed(Duration(milliseconds: 500));
if
(!
AuthService
.
to
.
isLoggedInValue
)
{
final
path
=
route
.
args
.
name
as
String
;
final
path
=
route
.
pageSettings
?
.
name
as
String
;
final
newRoute
=
Routes
.
LOGIN_THEN
(
path
);
return
RouteDecoder
.
fromRoute
(
newRoute
);
}
return
await
super
.
redirect
(
route
);
return
super
.
redirect
(
route
);
}
}
...
...
@@ -30,6 +30,6 @@ class EnsureNotAuthedMiddleware extends GetMiddleware {
//OR redirect user to another screen
//return RouteDecoder.fromRoute(Routes.PROFILE);
}
return
await
super
.
redirect
(
route
);
return
super
.
redirect
(
route
);
}
}
...
...
example_nav2/lib/app/modules/home/views/home_view.dart
View file @
8867b13
...
...
@@ -21,7 +21,7 @@ class HomeView extends GetView<HomeController> {
return
Scaffold
(
body:
GetRouterOutlet
(
initialRoute:
Routes
.
DASHBOARD
,
//
anchorRoute: Routes.HOME,
anchorRoute:
Routes
.
HOME
,
// key: Get.nestedKey(Routes.HOME),
),
bottomNavigationBar:
BottomNavigationBar
(
...
...
example_nav2/lib/app/modules/root/views/root_view.dart
View file @
8867b13
...
...
@@ -19,7 +19,7 @@ class RootView extends GetView<RootController> {
),
body:
GetRouterOutlet
(
initialRoute:
Routes
.
HOME
,
//
anchorRoute: '/',
anchorRoute:
'/'
,
// filterPages: (afterAnchor) {
// return afterAnchor.take(1);
// },
...
...
lib/get_navigation/src/extension_navigation.dart
View file @
8867b13
...
...
@@ -76,7 +76,7 @@ extension ExtensionDialog on GetInterface {
Curve
?
transitionCurve
,
String
?
name
,
RouteSettings
?
routeSettings
,
dynamic
id
,
String
?
id
,
})
{
assert
(
debugCheckHasMaterialLocalizations
(
context
!));
...
...
@@ -123,7 +123,7 @@ extension ExtensionDialog on GetInterface {
RouteTransitionsBuilder
?
transitionBuilder
,
GlobalKey
<
NavigatorState
>?
navigatorKey
,
RouteSettings
?
routeSettings
,
dynamic
id
})
{
String
?
id
})
{
assert
(!
barrierDismissible
||
barrierLabel
!=
null
);
final
key
=
navigatorKey
??
Get
.
nestedKey
(
id
)?.
navigatorKey
;
final
nav
=
key
?.
currentState
??
...
...
@@ -149,7 +149,7 @@ extension ExtensionDialog on GetInterface {
EdgeInsetsGeometry
?
titlePadding
,
TextStyle
?
titleStyle
,
Widget
?
content
,
dynamic
id
,
String
?
id
,
EdgeInsetsGeometry
?
contentPadding
,
VoidCallback
?
onConfirm
,
VoidCallback
?
onCancel
,
...
...
@@ -580,9 +580,9 @@ extension GetNavigationExt on GetInterface {
bool
preventDuplicates
=
true
,
Map
<
String
,
String
>?
parameters
,
})
{
if
(
preventDuplicates
&&
page
==
currentRoute
)
{
return
null
;
}
// if (preventDuplicates && page == currentRoute) {
// return null;
// }
if
(
parameters
!=
null
)
{
final
uri
=
Uri
(
path:
page
,
queryParameters:
parameters
);
...
...
@@ -1076,12 +1076,16 @@ extension GetNavigationExt on GetInterface {
return
_getxController
.
addKey
(
newKey
);
}
GetDelegate
?
nestedKey
(
dynamic
key
)
{
GetDelegate
?
nestedKey
(
String
?
key
)
{
if
(
key
==
null
)
{
throw
'You need to define a ID'
;
}
keys
.
putIfAbsent
(
key
,
()
=>
GetDelegate
(
showHashOnUrl:
true
,
//debugLabel: 'Getx nested key: ${key.toString()}',
pages:
[],
pages:
RouteDecoder
.
fromRoute
(
key
).
currentChildrens
??
[],
),
);
return
keys
[
key
];
...
...
lib/get_navigation/src/root/get_material_app.dart
View file @
8867b13
...
...
@@ -263,8 +263,11 @@ class GetMaterialApp extends StatelessWidget {
navigatorKey:
navigatorKey
,
navigatorObservers:
(
navigatorObservers
==
null
?
<
NavigatorObserver
>[
GetObserver
(
routingCallback
,
Get
.
routing
)]
:
<
NavigatorObserver
>[
GetObserver
(
routingCallback
,
Get
.
routing
)]
..
addAll
(
navigatorObservers
!)));
:
<
NavigatorObserver
>[
GetObserver
(
routingCallback
,
Get
.
routing
),
...
navigatorObservers
!
]));
final
routeInformationParser
=
Get
.
createInformationParser
(
initialRoute:
initialRoute
??
getPages
?.
first
.
name
??
...
...
lib/get_navigation/src/routes/get_router_delegate.dart
View file @
8867b13
...
...
@@ -308,11 +308,11 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
}
@override
void
goToUnknownPage
([
bool
clearPages
=
false
])
{
Future
<
void
>
goToUnknownPage
([
bool
clearPages
=
false
])
async
{
if
(
clearPages
)
_activePages
.
clear
();
final
pageSettings
=
_buildPageSettings
(
notFoundRoute
.
name
);
final
routeDecoder
=
_getRouteDecoder
(
pageSettings
);
final
routeDecoder
=
await
_getRouteDecoder
(
pageSettings
);
_push
(
routeDecoder
!);
}
...
...
@@ -332,7 +332,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Map
<
String
,
String
>?
parameters
,
})
async
{
final
args
=
_buildPageSettings
(
page
,
arguments
);
final
route
=
_getRouteDecoder
<
T
>(
args
);
final
route
=
await
_getRouteDecoder
<
T
>(
args
);
if
(
route
!=
null
)
{
return
_push
<
T
>(
route
);
}
else
{
...
...
@@ -380,7 +380,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Get
.
addPage
(
getPage
);
final
args
=
_buildPageSettings
(
routeName
,
arguments
);
final
route
=
_getRouteDecoder
<
T
>(
args
);
final
route
=
await
_getRouteDecoder
<
T
>(
args
);
final
result
=
await
_push
<
T
>(
route
!,
rebuildStack:
rebuildStack
,
...
...
@@ -478,7 +478,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Map
<
String
,
String
>?
parameters
,
})
async
{
final
args
=
_buildPageSettings
(
page
,
arguments
);
final
route
=
_getRouteDecoder
<
T
>(
args
);
final
route
=
await
_getRouteDecoder
<
T
>(
args
);
if
(
route
==
null
)
return
null
;
while
(
_activePages
.
length
>
1
)
{
...
...
@@ -497,7 +497,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Map
<
String
,
String
>?
parameters
,
})
async
{
final
args
=
_buildPageSettings
(
page
,
arguments
);
final
route
=
_getRouteDecoder
<
T
>(
args
);
final
route
=
await
_getRouteDecoder
<
T
>(
args
);
if
(
route
==
null
)
return
null
;
final
newPredicate
=
predicate
??
(
route
)
=>
false
;
...
...
@@ -517,7 +517,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Map
<
String
,
String
>?
parameters
,
})
async
{
final
args
=
_buildPageSettings
(
page
,
arguments
);
final
route
=
_getRouteDecoder
<
T
>(
args
);
final
route
=
await
_getRouteDecoder
<
T
>(
args
);
if
(
route
==
null
)
return
null
;
_popWithResult
();
return
_push
<
T
>(
route
);
...
...
@@ -531,7 +531,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
])
async
{
final
arguments
=
_buildPageSettings
(
page
,
data
);
final
route
=
_getRouteDecoder
<
T
>(
arguments
);
final
route
=
await
_getRouteDecoder
<
T
>(
arguments
);
if
(
route
==
null
)
return
null
;
...
...
@@ -586,7 +586,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Future
<
R
?>
backAndtoNamed
<
T
,
R
>(
String
page
,
{
T
?
result
,
Object
?
arguments
})
async
{
final
args
=
_buildPageSettings
(
page
,
arguments
);
final
route
=
_getRouteDecoder
<
R
>(
args
);
final
route
=
await
_getRouteDecoder
<
R
>(
args
);
if
(
route
==
null
)
return
null
;
_popWithResult
<
T
>(
result
);
return
_push
<
R
>(
route
);
...
...
@@ -625,11 +625,11 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
final
index
=
_activePages
.
length
>
1
?
_activePages
.
length
-
1
:
0
;
Get
.
addPage
(
page
);
final
route
=
_getRouteDecoder
(
arguments
);
final
activePage
=
await
_getRouteDecoder
(
arguments
);
final
activePage
=
_configureRouterDecoder
<
T
>(
route
!,
arguments
);
//
final activePage = _configureRouterDecoder<T>(route!, arguments);
_activePages
[
index
]
=
activePage
;
_activePages
[
index
]
=
activePage
!
;
refresh
();
final
result
=
await
activePage
.
route
?.
completer
?.
future
as
Future
<
T
?>?;
...
...
@@ -670,7 +670,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
}
@protected
RouteDecoder
?
_getRouteDecoder
<
T
>(
PageSettings
arguments
)
{
Future
<
RouteDecoder
?>
_getRouteDecoder
<
T
>(
PageSettings
arguments
)
async
{
var
page
=
arguments
.
uri
.
path
;
final
parameters
=
arguments
.
params
;
if
(
parameters
.
isNotEmpty
)
{
...
...
@@ -681,7 +681,11 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
final
decoder
=
Get
.
routeTree
.
matchRoute
(
page
,
arguments:
arguments
);
final
route
=
decoder
.
route
;
if
(
route
==
null
)
return
null
;
return
_configureRouterDecoder
(
decoder
,
arguments
);
final
configure
=
_configureRouterDecoder
(
decoder
,
arguments
);
final
router
=
await
runMiddleware
(
configure
);
return
router
;
}
@protected
...
...
@@ -701,20 +705,20 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
arguments:
arguments
,
parameters:
parameters
,
);
return
decoder
;
}
Future
<
T
?>
_push
<
T
>(
RouteDecoder
activePage
,
Future
<
T
?>
_push
<
T
>(
RouteDecoder
res
,
{
bool
rebuildStack
=
true
,
PreventDuplicateHandlingMode
preventDuplicateHandlingMode
=
PreventDuplicateHandlingMode
.
ReorderRoutes
})
async
{
final
onStackPage
=
_activePages
.
firstWhereOrNull
(
(
element
)
=>
element
.
route
?.
key
==
activePage
.
route
?.
key
);
final
onStackPage
=
_activePages
.
firstWhereOrNull
((
element
)
=>
element
.
route
?.
key
==
res
.
route
?.
key
);
/// There are no duplicate routes in the stack
if
(
onStackPage
==
null
)
{
final
res
=
await
runMiddleware
(
activePage
);
_activePages
.
add
(
res
!);
_activePages
.
add
(
res
);
}
else
{
/// There are duplicate routes, reorder
switch
(
preventDuplicateHandlingMode
)
{
...
...
@@ -722,8 +726,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
break
;
case
PreventDuplicateHandlingMode
.
ReorderRoutes
:
_activePages
.
remove
(
onStackPage
);
final
res
=
await
runMiddleware
(
onStackPage
);
_activePages
.
add
(
res
!);
_activePages
.
add
(
res
);
break
;
case
PreventDuplicateHandlingMode
.
PopUntilOriginalRoute
:
while
(
_activePages
.
last
==
onStackPage
)
{
...
...
@@ -732,8 +735,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
break
;
case
PreventDuplicateHandlingMode
.
Recreate
:
_activePages
.
remove
(
onStackPage
);
final
res
=
await
runMiddleware
(
activePage
);
_activePages
.
add
(
res
!);
_activePages
.
add
(
res
);
break
;
default
:
}
...
...
@@ -742,7 +744,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
refresh
();
}
return
activePage
.
route
?.
completer
?.
future
as
Future
<
T
?>?;
return
res
.
route
?.
completer
?.
future
as
Future
<
T
?>?;
}
@override
...
...
lib/get_navigation/src/routes/route_middleware.dart
View file @
8867b13
...
...
@@ -220,7 +220,7 @@ class PageRedirect {
title:
_r
.
title
,
maintainState:
_r
.
maintainState
,
routeName:
_r
.
name
,
settings:
settings
,
settings:
_r
,
curve:
_r
.
curve
,
showCupertinoParallax:
_r
.
showCupertinoParallax
,
gestureWidth:
_r
.
gestureWidth
,
...
...
lib/get_navigation/src/routes/router_outlet.dart
View file @
8867b13
...
...
@@ -75,6 +75,8 @@ class _RouterOutletState<TDelegate extends RouterDelegate<T>, T extends Object>
}
class
GetRouterOutlet
extends
RouterOutlet
<
GetDelegate
,
RouteDecoder
>
{
GetRouterOutlet
({
String
?
anchorRoute
,
required
String
initialRoute
,
...
...
@@ -137,7 +139,7 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
return
(
emptyWidget
?.
call
(
rDelegate
)
??
SizedBox
.
shrink
());
},
pickPages:
pickPages
,
delegate:
delegate
??
Get
MaterialController
.
to
.
rootDelegate
,
delegate:
delegate
??
Get
.
rootController
.
rootDelegate
,
);
GetRouterOutlet
.
builder
({
...
...
lib/get_state_manager/src/simple/list_notifier.dart
View file @
8867b13
...
...
@@ -57,8 +57,7 @@ mixin ListNotifierSingleMixin on Listenable {
}
void
_notifyUpdate
()
{
final
list
=
_updaters
?.
toList
()
??
[];
for
(
var
element
in
list
)
{
for
(
var
element
in
_updaters
!)
{
element
();
}
}
...
...
pubspec.yaml
View file @
8867b13
name
:
get
description
:
Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX.
version
:
5.0.0-beta.1
4
version
:
5.0.0-beta.1
5
homepage
:
https://github.com/jonataslaw/getx
environment
:
...
...
test/navigation/middleware_test.dart
View file @
8867b13
...
...
@@ -11,11 +11,23 @@ class RedirectMiddleware extends GetMiddleware {
// }
@override
Future
<
RouteDecoder
?>
redirect
Delegate
(
RouteDecoder
route
)
async
{
Future
<
RouteDecoder
?>
redirect
(
RouteDecoder
route
)
async
{
return
RouteDecoder
.
fromRoute
(
'/second'
);
}
}
class
RedirectMiddlewareNull
extends
GetMiddleware
{
// @override
// RouteSettings redirect(String? route) {
// return RouteSettings(name: '/second');
// }
@override
Future
<
RouteDecoder
?>
redirect
(
RouteDecoder
route
)
async
{
return
route
;
}
}
void
main
(
)
{
testWidgets
(
"Middleware redirect smoke test"
,
(
tester
)
async
{
await
tester
.
pumpWidget
(
...
...
@@ -38,4 +50,28 @@ void main() {
print
(
Get
.
rootController
.
rootDelegate
.
currentConfiguration
?.
route
?.
name
);
expect
(
find
.
byType
(
SecondScreen
),
findsOneWidget
);
});
testWidgets
(
"Middleware redirect null test"
,
(
tester
)
async
{
await
tester
.
pumpWidget
(
GetMaterialApp
(
initialRoute:
'/'
,
getPages:
[
GetPage
(
name:
'/'
,
page:
()
=>
Container
()),
GetPage
(
name:
'/first'
,
page:
()
=>
FirstScreen
(),
middlewares:
[
RedirectMiddlewareNull
(),
]),
GetPage
(
name:
'/second'
,
page:
()
=>
SecondScreen
()),
GetPage
(
name:
'/third'
,
page:
()
=>
ThirdScreen
()),
],
),
);
await
tester
.
pump
();
Get
.
toNamed
(
'/first'
);
await
tester
.
pumpAndSettle
();
print
(
Get
.
rootController
.
rootDelegate
.
currentConfiguration
?.
route
?.
name
);
expect
(
find
.
byType
(
FirstScreen
),
findsOneWidget
);
});
}
...
...
Please
register
or
login
to post a comment