Need a persistent/same Bottom Navigation Bar for all screens - Flutter

前端 未结 9 1097
不思量自难忘°
不思量自难忘° 2021-02-01 21:50

I am a beginner with flutter and dart. I have been trying to implement a navigationBar on three different pages in my app. The toggling works well for an individual

相关标签:
9条回答
  • 2021-02-01 21:59

    Just make your index variable static like:

    static int index = 0;
    
    0 讨论(0)
  • 2021-02-01 22:00

    Use PageView and bottomNavigationBar :

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    /// This Widget is the main application widget.
    class MyApp extends StatelessWidget {
      static const String _title = 'Flutter App';
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: _title,
          home: App(),
        );
      }
    }
    
    class App extends StatefulWidget {
      App({Key key}) : super(key: key);
      _AppState createState() => _AppState();
    }
    
    class _AppState extends State<App> {
      PageController _myPage;
      var selectedPage;
    
      @override
      void initState() {
        super.initState();
        _myPage = PageController(initialPage: 1);
        selectedPage = 1;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: PageView(
              physics: NeverScrollableScrollPhysics(),
              controller: _myPage,
              children: <Widget>[
                Center(
                  child: Text("Another Page"),
                ),
                Center(
                    child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text("Page 1"),
                    RaisedButton(
                      onPressed: () {
                        _myPage.jumpToPage(0);
                        setState(() {
                          selectedPage = 0;
                        });
                      },
                      child: Text("Go to another page"),
                    )
                  ],
                )),
                Center(child: Text("Page 2")),
                Center(child: Text("Page 3")),
              ],
            ),
            bottomNavigationBar: BottomAppBar(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  IconButton(
                    icon: Icon(Icons.home),
                    color: selectedPage == 1 ? Colors.blue : Colors.grey,
                    onPressed: () {
                      _myPage.jumpToPage(1);
                      setState(() {
                        selectedPage = 1;
                      });
                    },
                  ),
                  IconButton(
                    icon: Icon(Icons.star),
                    color: selectedPage == 2 ? Colors.blue : Colors.grey,
                    onPressed: () {
                      _myPage.jumpToPage(2);
                      setState(() {
                        selectedPage = 2;
                      });
                    },
                  ),
                  IconButton(
                    icon: Icon(
                      Icons.settings,
                    ),
                    color: selectedPage == 3 ? Colors.blue : Colors.grey,
                    onPressed: () {
                      _myPage.jumpToPage(3);
                      setState(() {
                        selectedPage = 3;
                      });
                    },
                  ),
                ],
              ),
            ));
      }
    }
    

    Hope it helps.

    0 讨论(0)
  • 2021-02-01 22:03

    You can use IndexedStack to persist State when you touch/change the page

    Scaffold(
      body: SafeArea(
        top: false,
        child: IndexedStack(
          //Permet de garder le state des vues même quand on change de vue
          index: _currentIndex,
          children: _children,
        ),
      ),
      bottomNavigationBar: BottomNavigationBar( items: [ ] ),
    );
    
    0 讨论(0)
  • 2021-02-01 22:07

    Navigator.of(context).pushNamed(); is for Navigation with page transition. So, in this situation, the method is not match.

    You can use BottomNavigationBar with Scaffold.

    example code:

    
    class AppFooter extends StatefulWidget {
      @override
      _AppFooterState createState() => _AppFooterState();
    }
    
    class _AppFooterState extends State<AppFooter> {
      int _currentIndex = 0;
    
      List<Widget> _pages = [
        Text("page1"),
        Text("page2"),
        Text("page3"),
      ];
    
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: _pages[_currentIndex],
          bottomNavigationBar: BottomNavigationBar(
            type: BottomNavigationBarType.fixed,
            currentIndex: _currentIndex,
            onTap: (int index) {
              setState(() {
                _currentIndex = index;
              });
            },
            items: [
              new BottomNavigationBarItem(
                  backgroundColor: Colors.white,
                  icon: _currentIndex == 0
                      ? new Image.asset('assets/images/dashboard_active.png')
                      : new Image.asset('assets/images/dashboard_inactive.png'),
                  title:
                      new Text('Dashboard', style: new TextStyle(fontSize: 12.0))),
              new BottomNavigationBarItem(
                  backgroundColor: Colors.white,
                  icon: _currentIndex == 1
                      ? new Image.asset('assets/images/medical_sevice_active.png')
                      : new Image.asset(
                          'assets/images/medical_sevice_inactive.png'),
                  title: new Text('Health Services',
                      style: new TextStyle(fontSize: 12.0))),
              new BottomNavigationBarItem(
                  icon: InkWell(
                    child: Icon(
                      Icons.format_align_left,
                      // color: green,
                      size: 20.0,
                    ),
                  ),
                  title: new Text('History', style: new TextStyle(fontSize: 12.0))),
            ],
          ),
        );
      }
    }
    
    
    0 讨论(0)
  • 2021-02-01 22:14

    Another great solution is the persistent_bottom_nav_bar package provided by Bilal Shahid.

    It is easy to use and offers you a bunch of features:

    • Highly customizable persistent bottom navigation bar.
    • Ability to push new screens with or without bottom navigation bar.
    • 20 styles for the bottom navigation bar.
    • Includes functions for pushing screen with or without the bottom navigation bar i.e. pushNewScreen() and pushNewScreenWithRouteSettings().
    • Based on flutter's Cupertino(iOS) bottom navigation bar.
    • Can be translucent for a particular tab.
    • Custom styling for the navigation bar. Click here for more information. Handles hardware/software Android back button.

    Before I found this package I followed the solution from the article @Abin mentioned in his answer. But I ran into the problem, that all screens from the navbar beeing loaded on first load of the navbar which is not that perfomant. I did not mangaed to solve this, but luckily Bilal Shahid provide a good solution with his package.

    All credits to him.

    0 讨论(0)
  • 2021-02-01 22:15

    I am working on a beta version of an express_app plugin, which achieve the required result.

    Two days ago, I implemented an addition where you can set an ExpressHome and it can be any part of your tree, in addition to setting your routes of course. When changing the routes, everything under ExpressHome will change only and the rest will stay the same (i.e. you can have a permanent bar easily.

    I will publish a more-recent version this evening, and if you would like a specific demo about your use case, let me know.

    0 讨论(0)
提交回复
热议问题