Line data Source code
1 : import 'package:flutter/material.dart'; 2 : import 'package:flutter/widgets.dart'; 3 : 4 : class NestedNavigator extends StatelessWidget { 5 : final GlobalKey<NavigatorState> navigationKey; 6 : final String initialRoute; 7 : final Map<String, WidgetBuilder> routes; 8 : final Function() onWillPop; 9 : 10 1 : NestedNavigator({ 11 : @required this.navigationKey, 12 : @required this.initialRoute, 13 : @required this.routes, 14 : this.onWillPop, 15 : }); 16 : 17 1 : @override 18 : Widget build(BuildContext context) { 19 1 : return WillPopScope( 20 1 : child: Navigator( 21 1 : key: navigationKey, 22 1 : initialRoute: initialRoute, 23 1 : onGenerateRoute: (RouteSettings routeSettings) { 24 3 : WidgetBuilder builder = routes[routeSettings.name]; 25 3 : if (routeSettings.name == initialRoute) { 26 1 : return PageRouteBuilder( 27 2 : pageBuilder: (context, __, ___) => builder(context), 28 : settings: routeSettings, 29 : ); 30 : } else { 31 0 : return MaterialPageRoute( 32 : builder: builder, 33 : settings: routeSettings, 34 : ); 35 : } 36 : }, 37 : ), 38 0 : onWillPop: () { 39 0 : if (this.onWillPop != null) { 40 0 : this.onWillPop(); 41 : } 42 : 43 0 : if (navigationKey.currentState.canPop()) { 44 0 : navigationKey.currentState.pop(); 45 0 : return Future<bool>.value(false); 46 : } 47 : 48 0 : return Future<bool>.value(true); 49 : }, 50 : ); 51 : } 52 : }