Jonny Borges
Committed by GitHub

Merge pull request #2148 from jonataslaw/refactor-nav

try fix middleware
... ... @@ -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);
}
}
... ...
... ... @@ -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(
... ...
... ... @@ -19,7 +19,7 @@ class RootView extends GetView<RootController> {
),
body: GetRouterOutlet(
initialRoute: Routes.HOME,
// anchorRoute: '/',
anchorRoute: '/',
// filterPages: (afterAnchor) {
// return afterAnchor.take(1);
// },
... ...
... ... @@ -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];
... ...
... ... @@ -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 ??
... ...
... ... @@ -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
... ...
... ... @@ -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,
... ... @@ -259,7 +259,7 @@ class PageRedirect {
if (match.route!.middlewares == null || match.route!.middlewares!.isEmpty) {
return false;
}
// final newSettings = runner.runRedirect(settings!.name);
// final newSettings = runner.runRedirect(settings!.name);
// if (newSettings == null) {
// return false;
// }
... ...
... ... @@ -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,
... ... @@ -99,7 +101,7 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
}
return ret;
},
emptyPage: (delegate) =>
emptyPage: (delegate) =>
Get.routeTree.matchRoute(initialRoute).route ??
delegate.notFoundRoute,
key: Get.nestedKey(anchorRoute)?.navigatorKey,
... ... @@ -137,7 +139,7 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
return (emptyWidget?.call(rDelegate) ?? SizedBox.shrink());
},
pickPages: pickPages,
delegate: delegate ?? GetMaterialController.to.rootDelegate,
delegate: delegate ?? Get.rootController.rootDelegate,
);
GetRouterOutlet.builder({
... ...
... ... @@ -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();
}
}
... ...
name: get
description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX.
version: 5.0.0-beta.14
version: 5.0.0-beta.15
homepage: https://github.com/jonataslaw/getx
environment:
... ...
... ... @@ -11,11 +11,23 @@ class RedirectMiddleware extends GetMiddleware {
// }
@override
Future<RouteDecoder?> redirectDelegate(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);
});
}
... ...