From 809b99581263a426d039de8871dc5a6b89fd54ec Mon Sep 17 00:00:00 2001 From: Jonny Borges <35742643+jonataslaw@users.noreply.github.com> Date: Tue, 27 Aug 2024 17:16:41 -0300 Subject: [PATCH 1/3] improve getpage --- example_nav2/lib/app/routes/app_pages.dart | 52 +++++++++++++++---- .../src/routes/default_route.dart | 19 +++---- lib/get_navigation/src/routes/get_route.dart | 11 ++++ .../src/routes/new_path_route.dart | 2 +- .../src/routes/route_middleware.dart | 22 +++----- pubspec.yaml | 2 +- 6 files changed, 70 insertions(+), 38 deletions(-) diff --git a/example_nav2/lib/app/routes/app_pages.dart b/example_nav2/lib/app/routes/app_pages.dart index ff24e668b..ad7bdbf1a 100644 --- a/example_nav2/lib/app/routes/app_pages.dart +++ b/example_nav2/lib/app/routes/app_pages.dart @@ -1,6 +1,8 @@ +import 'dart:developer'; + +import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; -import '../middleware/auth_middleware.dart'; import '../modules/dashboard/bindings/dashboard_binding.dart'; import '../modules/dashboard/views/dashboard_view.dart'; import '../modules/home/bindings/home_binding.dart'; @@ -32,12 +34,11 @@ class AppPages { bindings: [RootBinding()], participatesInRootNavigator: true, preventDuplicates: true, + middlewares: [ + MainMiddleware(), + ], children: [ GetPage( - middlewares: [ - //only enter this route when not authed - EnsureNotAuthedMiddleware(), - ], name: _Paths.login, page: () => const LoginView(), bindings: [LoginBinding()], @@ -59,9 +60,9 @@ class AppPages { ], ), GetPage( - middlewares: [ + middlewares: const [ //only enter this route when authed - EnsureAuthMiddleware(), + // EnsureAuthMiddleware(), ], name: _Paths.profile, page: () => const ProfileView(), @@ -84,10 +85,6 @@ class AppPages { showCupertinoParallax: true, page: () => const ProductDetailsView(), bindings: const [], - middlewares: [ - //only enter this route when authed - EnsureAuthMiddleware(), - ], ), ], ), @@ -104,3 +101,36 @@ class AppPages { ), ]; } + +class MainMiddleware extends GetMiddleware { + @override + void onPageDispose() { + log('MainMiddleware onPageDispose'); + super.onPageDispose(); + } + + @override + Widget onPageBuilt(Widget page) { + log('MainMiddleware onPageBuilt'); + return super.onPageBuilt(page); + } + + @override + GetPage? onPageCalled(GetPage? page) { + log('MainMiddleware onPageCalled for route: ${page?.name}'); + return super.onPageCalled(page); + } + + @override + List? onBindingsStart(List? bindings) { + log('MainMiddleware onBindingsStart'); + return super.onBindingsStart(bindings); + } + + @override + GetPageBuilder? onPageBuildStart(GetPageBuilder? page) { + log('MainMiddleware onPageBuildStart'); + + return super.onPageBuildStart(page); + } +} diff --git a/lib/get_navigation/src/routes/default_route.dart b/lib/get_navigation/src/routes/default_route.dart index aebaa7882..ec0b61b35 100644 --- a/lib/get_navigation/src/routes/default_route.dart +++ b/lib/get_navigation/src/routes/default_route.dart @@ -63,7 +63,8 @@ class GetPageRoute extends PageRoute this.maintainState = true, super.fullscreenDialog, this.middlewares, - }) : bindings = (binding == null) ? bindings : [...bindings, binding]; + }) : bindings = (binding == null) ? bindings : [...bindings, binding], + _middlewareRunner = MiddlewareRunner(middlewares); @override final Duration transitionDuration; @@ -101,11 +102,12 @@ class GetPageRoute extends PageRoute @override final bool maintainState; + final MiddlewareRunner _middlewareRunner; + @override void dispose() { super.dispose(); - final middlewareRunner = MiddlewareRunner(middlewares); - middlewareRunner.runOnPageDispose(); + _middlewareRunner.runOnPageDispose(); _child = null; } @@ -113,14 +115,13 @@ class GetPageRoute extends PageRoute Widget _getChild() { if (_child != null) return _child!; - final middlewareRunner = MiddlewareRunner(middlewares); final localBinds = [if (binds != null) ...binds!]; - final bindingsToBind = middlewareRunner + final bindingsToBind = _middlewareRunner .runOnBindingsStart(bindings.isNotEmpty ? bindings : localBinds); - final pageToBuild = middlewareRunner.runOnPageBuildStart(page)!; + final pageToBuild = _middlewareRunner.runOnPageBuildStart(page)!; if (bindingsToBind != null && bindingsToBind.isNotEmpty) { if (bindingsToBind is List) { @@ -129,19 +130,19 @@ class GetPageRoute extends PageRoute if (dep is List) { _child = Binds( binds: dep, - child: middlewareRunner.runOnPageBuilt(pageToBuild()), + child: _middlewareRunner.runOnPageBuilt(pageToBuild()), ); } } } else if (bindingsToBind is List) { _child = Binds( binds: bindingsToBind, - child: middlewareRunner.runOnPageBuilt(pageToBuild()), + child: _middlewareRunner.runOnPageBuilt(pageToBuild()), ); } } - return _child ??= middlewareRunner.runOnPageBuilt(pageToBuild()); + return _child ??= _middlewareRunner.runOnPageBuilt(pageToBuild()); } @override diff --git a/lib/get_navigation/src/routes/get_route.dart b/lib/get_navigation/src/routes/get_route.dart index 334c50088..3968f7511 100644 --- a/lib/get_navigation/src/routes/get_route.dart +++ b/lib/get_navigation/src/routes/get_route.dart @@ -53,6 +53,8 @@ class GetPage extends Page { final PreventDuplicateHandlingMode preventDuplicateHandlingMode; + static void _defaultPopInvokedHandler(bool didPop, Object? result) {} + GetPage({ required this.name, required this.page, @@ -85,6 +87,9 @@ class GetPage extends Page { this.completer, this.inheritParentPath = true, LocalKey? key, + super.canPop, + super.onPopInvoked = _defaultPopInvokedHandler, + super.restorationId, }) : path = _nameToRegex(name), assert(name.startsWith('/'), 'It is necessary to start route name [$name] with a slash: /$name'), @@ -125,6 +130,9 @@ class GetPage extends Page { bool? showCupertinoParallax, Completer? completer, bool? inheritParentPath, + bool? canPop, + PopInvokedWithResultCallback? onPopInvoked, + String? restorationId, }) { return GetPage( key: key ?? this.key, @@ -158,6 +166,9 @@ class GetPage extends Page { showCupertinoParallax ?? this.showCupertinoParallax, completer: completer ?? this.completer, inheritParentPath: inheritParentPath ?? this.inheritParentPath, + canPop: canPop ?? this.canPop, + onPopInvoked: onPopInvoked ?? this.onPopInvoked, + restorationId: restorationId ?? restorationId, ); } diff --git a/lib/get_navigation/src/routes/new_path_route.dart b/lib/get_navigation/src/routes/new_path_route.dart index 8c1b4912a..87dadcf27 100644 --- a/lib/get_navigation/src/routes/new_path_route.dart +++ b/lib/get_navigation/src/routes/new_path_route.dart @@ -163,7 +163,7 @@ class RouteTree { void removeRoute(GetPage route) { matcher.removeRoute(route.name); - tree.remove(route.path); + tree.remove(route.name); } void removeRoutes(List routes) { diff --git a/lib/get_navigation/src/routes/route_middleware.dart b/lib/get_navigation/src/routes/route_middleware.dart index 7fcd4ac3a..1112d7f58 100644 --- a/lib/get_navigation/src/routes/route_middleware.dart +++ b/lib/get_navigation/src/routes/route_middleware.dart @@ -11,8 +11,6 @@ import '../../../get.dart'; abstract class GetMiddleware { GetMiddleware({this.priority = 0}); - final bool _wasInitiated = false; - /// The Order of the Middlewares to run. /// /// {@tool snippet} @@ -104,12 +102,7 @@ class MiddlewareRunner { MiddlewareRunner(List? middlewares) : _middlewares = middlewares != null ? (List.of(middlewares)..sort(_compareMiddleware)) - : const [] { - // for (final middleware in _middlewares) { - // if (middleware._wasInitiated) continue; - // middleware._wasInitiated = true; - // } - } + : const []; final List _middlewares; @@ -118,10 +111,6 @@ class MiddlewareRunner { GetPage? runOnPageCalled(GetPage? page) { for (final middleware in _middlewares) { - if (middleware._wasInitiated) { - _middlewares.remove(middleware); - continue; - } page = middleware.onPageCalled(page); } return page; @@ -225,14 +214,15 @@ class PageRedirect { return false; } + // No middlewares found return match. + if (match.route!.middlewares.isEmpty) { + return false; + } + final runner = MiddlewareRunner(match.route!.middlewares); route = runner.runOnPageCalled(match.route); addPageParameter(route!); - // // No middlewares found return match. - // if (match.route!.middlewares.isEmpty) { - // return false; - // } final newSettings = runner.runRedirect(settings!.name); if (newSettings == null) { return false; diff --git a/pubspec.yaml b/pubspec.yaml index 99e36917d..fe088b664 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - web: ">=1.0.0 <2.0.0" + web: ">=0.5.0 <2.0.0" dev_dependencies: flutter_lints: ^4.0.0 From 30a89f53a554c326f2d691ed02acbcc26ff33393 Mon Sep 17 00:00:00 2001 From: Jonny Borges <35742643+jonataslaw@users.noreply.github.com> Date: Tue, 27 Aug 2024 17:21:11 -0300 Subject: [PATCH 2/3] comeback example --- example_nav2/lib/app/routes/app_pages.dart | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/example_nav2/lib/app/routes/app_pages.dart b/example_nav2/lib/app/routes/app_pages.dart index ad7bdbf1a..bd3861ea5 100644 --- a/example_nav2/lib/app/routes/app_pages.dart +++ b/example_nav2/lib/app/routes/app_pages.dart @@ -1,8 +1,9 @@ import 'dart:developer'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../middleware/auth_middleware.dart'; import '../modules/dashboard/bindings/dashboard_binding.dart'; import '../modules/dashboard/views/dashboard_view.dart'; import '../modules/home/bindings/home_binding.dart'; @@ -34,11 +35,12 @@ class AppPages { bindings: [RootBinding()], participatesInRootNavigator: true, preventDuplicates: true, - middlewares: [ - MainMiddleware(), - ], children: [ GetPage( + middlewares: [ + //only enter this route when not authed + EnsureNotAuthedMiddleware(), + ], name: _Paths.login, page: () => const LoginView(), bindings: [LoginBinding()], @@ -60,9 +62,9 @@ class AppPages { ], ), GetPage( - middlewares: const [ + middlewares: [ //only enter this route when authed - // EnsureAuthMiddleware(), + EnsureAuthMiddleware(), ], name: _Paths.profile, page: () => const ProfileView(), @@ -85,6 +87,10 @@ class AppPages { showCupertinoParallax: true, page: () => const ProductDetailsView(), bindings: const [], + middlewares: [ + //only enter this route when authed + EnsureAuthMiddleware(), + ], ), ], ), From 7a133d4ec1b4117011354a5df4d2043ac7f2b0d9 Mon Sep 17 00:00:00 2001 From: Jonny Borges <35742643+jonataslaw@users.noreply.github.com> Date: Tue, 27 Aug 2024 17:23:02 -0300 Subject: [PATCH 3/3] release --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3bbdb76d..b137eccb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [5.0.0-release-candidate-11] + +- Add canPop to GetPage + ## [5.0.0-release-candidate-10] - Fix Get.offNamedUntil diff --git a/pubspec.yaml b/pubspec.yaml index fe088b664..d78dcb2d3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: get description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX. -version: 5.0.0-release-candidate-10 +version: 5.0.0-release-candidate-11 homepage: https://github.com/jonataslaw/getx environment: