Skip to content

Instantly share code, notes, and snippets.

@eximius313
Created January 20, 2023 00:22
Show Gist options
  • Save eximius313/bc4d1013a9b0fd084454b7e372d7c3d3 to your computer and use it in GitHub Desktop.
Save eximius313/bc4d1013a9b0fd084454b7e372d7c3d3 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
void main() {
runApp(MainApp());
}
class MainApp extends StatelessWidget {
final RouterDelegate<AppState> _routerDelegate = MainRouterDelegate();
MainApp({super.key});
@override
Widget build(BuildContext context) =>
MaterialApp.router(
routerDelegate: _routerDelegate,
backButtonDispatcher: RootBackButtonDispatcher(),
);
}
class MainRouterDelegate extends RouterDelegate<AppState>
with ChangeNotifier, PopNavigatorRouterDelegateMixin<AppState> {
@override
final GlobalKey<NavigatorState> navigatorKey;
MainRouterDelegate() : navigatorKey = GlobalKey<NavigatorState>();
final AppState appState = AppState();
@override
Widget build(BuildContext context) => Navigator(
key: navigatorKey,
pages: [
MaterialPage(
child: MainScreen(
key: const ValueKey("mainScreen"),
text: "My Page",
appState: appState,
)
),
const MaterialPage(child: InnerScreen(text: "Inner screen"))
],
onPopPage: (route, result) {
print('MainRouter#onPopPage');
if (!route.didPop(result)) {
return false;
}
return true;
},
);
@override
Future<void> setNewRoutePath(AppState configuration) async {
}
}
class MainScreen extends StatefulWidget {
MainScreen({super.key, required this.text, required this.appState}): _innerRouterDelegate = InnerRouterDelegate();
final String text;
final AppState appState;
final RouterDelegate<AppState> _innerRouterDelegate;
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
@override
Widget build(BuildContext context) => Scaffold(
body: Router(
routerDelegate: widget._innerRouterDelegate,
),
);
}
class InnerRouterDelegate extends RouterDelegate<AppState>
with ChangeNotifier, PopNavigatorRouterDelegateMixin<AppState> {
@override
final GlobalKey<NavigatorState> navigatorKey;
InnerRouterDelegate() : navigatorKey = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) => Navigator(
key: navigatorKey,
pages: const [
MaterialPage(
child: InnerScreen(
key: ValueKey("innerScreen"),
text: "Main screen",
)
),
],
onPopPage: (route, result) {
print('InnerRouter#onPopPage');
if (!route.didPop(result)) {
return false;
}
return true;
},
);
@override
Future<void> setNewRoutePath(AppState configuration) async {
}
}
class AppState extends ChangeNotifier {
}
class InnerScreen extends StatelessWidget {
const InnerScreen({super.key, required this.text});
final String text;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Column(
children: [
Text(text),
],
),
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment