Aniket Khote
Committed by GitHub

Merge branch 'jonataslaw:master' into master

... ... @@ -8,7 +8,7 @@ FLUTTER_BUILD_NAME=1.0.0
FLUTTER_BUILD_NUMBER=1
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iMjAxODNlMDQwOTYwOTRiY2MzN2Q5Y2RlMmE0Yjk2ZjVjYzY4NGNmLw==
DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iOGQzNTgxMGU5MWFiOGZjMzliYTVlN2E0MWJmZjZmNjk3ZThlM2E4Lw==
DART_OBFUSCATION=false
TRACK_WIDGET_CREATION=true
TREE_SHAKE_ICONS=false
... ...
... ... @@ -7,7 +7,7 @@ export "FLUTTER_TARGET=/Users/jonatasborges/getx5/getx/example_nav2/lib/main.dar
export "FLUTTER_BUILD_DIR=build"
export "FLUTTER_BUILD_NAME=1.0.0"
export "FLUTTER_BUILD_NUMBER=1"
export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iMjAxODNlMDQwOTYwOTRiY2MzN2Q5Y2RlMmE0Yjk2ZjVjYzY4NGNmLw=="
export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9iOGQzNTgxMGU5MWFiOGZjMzliYTVlN2E0MWJmZjZmNjk3ZThlM2E4Lw=="
export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=true"
export "TREE_SHAKE_ICONS=false"
... ...
... ... @@ -63,4 +63,3 @@ class HomeView extends GetView<HomeController> {
);
}
}
... ...
... ... @@ -37,7 +37,6 @@ class ProfileView extends GetView<ProfileController> {
child: const Text('Show a test dialog in Home router outlet'),
onPressed: () {
//shows a dialog
Get.defaultDialog(
title: 'Test Dialog In Home Outlet !!',
barrierDismissible: true,
... ...
... ... @@ -10,31 +10,21 @@ class RootView extends GetView<RootController> {
@override
Widget build(BuildContext context) {
return RouterOutlet.builder(
delegate: Get.nestedKey(null),
builder: (context) {
final title = context.location;
return Scaffold(
drawer: const DrawerWidget(),
appBar: AppBar(
title: Text(title),
centerTitle: true,
),
//body: HomeView(),
return Scaffold(
drawer: const DrawerWidget(),
appBar: AppBar(
title: RouterListener(builder: (context) {
final title = context.location;
return Text(title);
}),
centerTitle: true,
),
//body: HomeView(),
body: GetRouterOutlet(
initialRoute: Routes.home,
delegate: Get.nestedKey(null),
anchorRoute: '/',
filterPages: (afterAnchor) {
// print(afterAnchor);
// print('dddddddddddddddddd');
// print(afterAnchor.take(1));
return afterAnchor.take(1);
},
),
);
},
body: GetRouterOutlet(
initialRoute: Routes.home,
anchorRoute: '/',
),
);
}
}
... ...
... ... @@ -75,6 +75,10 @@ class RouteDecoder {
@override
int get hashCode => currentTreeBranch.hashCode ^ pageSettings.hashCode;
@override
String toString() =>
'RouteDecoder(currentTreeBranch: $currentTreeBranch, pageSettings: $pageSettings)';
}
class ParseRouteTree {
... ...
... ... @@ -84,7 +84,9 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
required String initialRoute,
Iterable<GetPage> Function(Iterable<GetPage> afterAnchor)? filterPages,
GetDelegate? delegate,
String? restorationScopeId,
}) : this.pickPages(
restorationScopeId: restorationScopeId,
pickPages: (config) {
Iterable<GetPage<dynamic>> ret;
if (anchorRoute == null) {
... ... @@ -114,6 +116,7 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
GetPage Function(GetDelegate delegate)? emptyPage,
required Iterable<GetPage> Function(RouteDecoder currentNavStack) pickPages,
bool Function(Route<dynamic>, dynamic)? onPopPage,
String? restorationScopeId,
GlobalKey<NavigatorState>? navigatorKey,
GetDelegate? delegate,
}) : super(
... ... @@ -124,17 +127,22 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
].whereType<GetPage>();
if (pageRes.isNotEmpty) {
return GetNavigator(
onPopPage: onPopPage ??
(route, result) {
final didPop = route.didPop(result);
if (!didPop) {
return false;
}
return true;
},
pages: pageRes.toList(),
key: navigatorKey,
return InheritedNavigator(
navigatorKey: navigatorKey ??
Get.rootController.rootDelegate.navigatorKey,
child: GetNavigator(
restorationScopeId: restorationScopeId,
onPopPage: onPopPage ??
(route, result) {
final didPop = route.didPop(result);
if (!didPop) {
return false;
}
return true;
},
pages: pageRes.toList(),
key: navigatorKey,
),
);
}
return (emptyWidget?.call(rDelegate) ?? const SizedBox.shrink());
... ... @@ -159,35 +167,44 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
);
}
extension PagesListExt on List<GetPage> {
Iterable<GetPage> pickAtRoute(String route) {
return skipWhile((value) {
return value.name != route;
});
class InheritedNavigator extends InheritedWidget {
const InheritedNavigator({
super.key,
required super.child,
required this.navigatorKey,
});
final GlobalKey<NavigatorState> navigatorKey;
static InheritedNavigator? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<InheritedNavigator>();
}
Iterable<GetPage> pickAfterRoute(String route) {
return pickAtRoute(route).skip(1);
@override
bool updateShouldNotify(InheritedNavigator oldWidget) {
return true;
}
}
class GetRouterOutletInherited extends InheritedWidget {
final String anchorRoute;
const GetRouterOutletInherited({
super.key,
required this.anchorRoute,
required Widget child,
}) : super(child: child);
extension NavKeyExt on BuildContext {
GlobalKey<NavigatorState>? get parentNavigatorKey {
return InheritedNavigator.of(this)?.navigatorKey;
}
}
static GetRouterOutletInherited? of(BuildContext context) {
return context
.dependOnInheritedWidgetOfExactType<GetRouterOutletInherited>();
extension PagesListExt on List<GetPage> {
/// Returns the route and all following routes after the given route.
Iterable<GetPage> pickFromRoute(String route) {
return skipWhile((value) => value.name != route);
}
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
return true;
/// Returns the routes after the given route.
Iterable<GetPage> pickAfterRoute(String route) {
// If the provided route is root, we take the first route after root.
if (route == '/') {
return pickFromRoute(route).skip(1).take(1);
}
// Otherwise, we skip the route and take all routes after it.
return pickFromRoute(route).skip(1);
}
}
... ... @@ -221,3 +238,93 @@ class IndexedRouteBuilder<T> extends StatelessWidget {
return builder(context, routes, index);
}
}
mixin RouterListenerMixin<T extends StatefulWidget> on State<T> {
RouterDelegate? delegate;
void _listener() {
setState(() {});
}
VoidCallback? disposer;
@override
void didChangeDependencies() {
super.didChangeDependencies();
disposer?.call();
final router = Router.of(context);
delegate ??= router.routerDelegate as GetDelegate;
delegate?.addListener(_listener);
disposer = () => delegate?.removeListener(_listener);
}
@override
void dispose() {
super.dispose();
disposer?.call();
}
}
class RouterListenerInherited extends InheritedWidget {
const RouterListenerInherited({
super.key,
required Widget child,
}) : super(child: child);
static RouterListenerInherited? of(BuildContext context) {
return context
.dependOnInheritedWidgetOfExactType<RouterListenerInherited>();
}
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
return true;
}
}
class RouterListener extends StatefulWidget {
const RouterListener({
Key? key,
required this.builder,
}) : super(key: key);
final WidgetBuilder builder;
@override
State<RouterListener> createState() => RouteListenerState();
}
class RouteListenerState extends State<RouterListener>
with RouterListenerMixin {
@override
Widget build(BuildContext context) {
return RouterListenerInherited(child: Builder(builder: widget.builder));
}
}
class BackButtonCallback extends StatefulWidget {
const BackButtonCallback({Key? key, required this.builder}) : super(key: key);
final WidgetBuilder builder;
@override
State<BackButtonCallback> createState() => RouterListenerState();
}
class RouterListenerState extends State<BackButtonCallback>
with RouterListenerMixin {
late ChildBackButtonDispatcher backButtonDispatcher;
@override
void didChangeDependencies() {
super.didChangeDependencies();
final router = Router.of(context);
backButtonDispatcher =
router.backButtonDispatcher!.createChildBackButtonDispatcher();
}
@override
Widget build(BuildContext context) {
backButtonDispatcher.takePriority();
return widget.builder(context);
}
}
... ...