|
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), |
|
], |
|
), |
|
), |
|
); |
|
} |
|
} |