How to persist BottomNavigationBar when using Flutter navigation and routes How to persist BottomNavigationBar when using Flutter navigation and routes dart dart

How to persist BottomNavigationBar when using Flutter navigation and routes


I have added an answer to the post that you linked: https://stackoverflow.com/a/59133502/6064621

The answer below is similar to the one above, but I've also added unknown routes here:


What you want can be achieved by using a custom Navigator.

The Flutter team did a video on this, and the article they followed is here: https://medium.com/flutter/getting-to-the-bottom-of-navigation-in-flutter-b3e440b9386

Basically, you will need to wrap the body of your Scaffold in a custom Navigator:

class _MainScreenState extends State<MainScreen> {  final _navigatorKey = GlobalKey<NavigatorState>();  // ...  @override  Widget build(BuildContext context) {    return Scaffold(      body: Navigator(        key: _navigatorKey,        initialRoute: '/',        onGenerateRoute: (RouteSettings settings) {          WidgetBuilder builder;          // Manage your route names here          switch (settings.name) {            case '/':              builder = (BuildContext context) => HomePage();              break;            case '/page1':              builder = (BuildContext context) => Page1();              break;            case '/page2':              builder = (BuildContext context) => Page2();              break;            default:              throw Exception('Invalid route: ${settings.name}');          }          // You can also return a PageRouteBuilder and          // define custom transitions between pages          return MaterialPageRoute(            builder: builder,            settings: settings,          );        },      ),      bottomNavigationBar: _yourBottomNavigationBar,    );  }}

Within your bottom navigation bar, to navigate to a new screen in the new custom Navigator, you just have to call this:

_navigatorKey.currentState.pushNamed('/yourRouteName');

If you don't used named routes, then here is what you should do for your custom Navigator, and for navigating to new screens:

// Replace the above onGenerateRoute function with this oneonGenerateRoute: (RouteSettings settings) {  return MaterialPageRoute(    builder: (BuildContext context) => YourHomePage(),    settings: settings,  );},
_navigatorKey.currentState.push(MaterialPageRoute(  builder: (BuildContext context) => YourNextPage(),));

To let Navigator.pop take you to the previous view, you will need to wrap the custom Navigator with a WillPopScope:

@overrideWidget build(BuildContext context) {  return Scaffold(    body: WillPopScope(      onWillPop: () async {        if (_navigatorKey.currentState.canPop()) {          _navigatorKey.currentState.pop();          return false;        }        return true;      },      child: Navigator(        // ...      ),    ),    bottomNavigationBar: _yourBottomNavigationBar,  );}

And that should be it! No need to manually handle pop too much or manage a custom history list.


wrap your body inside the IndexedStack widget. Like this:

body: IndexedStack(      index: selectedIndex,      children: _children, //define a  widget children list    ),

Here's a link https://medium.com/flutter/getting-to-the-bottom-of-navigation-in-flutter-b3e440b9386


Have you tried this?

    return Scaffold(      backgroundColor: Colors.white,      appBar: EmptyAppBar(),      body: _displayedPage[_selectedIndex],      bottomNavigationBar: _createBottomNavigationbar,    );

Then you make a widget list of all the Screens you want:

List<Widget> _displayedPage = [LatestReadingPage(), HomeScreen(), ExampleScreen()];