How to preserve widget states in flutter, when navigating using BottomNavigationBar?

后端 未结 6 1434
青春惊慌失措
青春惊慌失措 2020-11-27 12:20

I\'m currently working on building a Flutter app that will preserve states when navigating from one screen, to another, and back again when utilizing BottomNavigationBar. Ju

6条回答
  •  萌比男神i
    2020-11-27 13:12

    Instead of returning new instance every time you run pageChooser, have one instance created and return the same.

    Example:

    class Pages extends StatefulWidget {
      @override
      createState() => new PagesState();
    }
    
    class PagesState extends State {
      int pageIndex = 0;
    
      // Create all the pages once and return same instance when required
      final ProfilePage _profilePage = new ProfilePage(); 
      final PlanPage _planPage = new PlanPage();
      final StartUpNamerPage _startUpNamerPage = new StartUpNamerPage();
    
    
      Widget pageChooser() {
        switch (this.pageIndex) {
          case 0:
            return _profilePage;
            break;
    
          case 1:
            return _planPage;
            break;
    
          case 2:
            return _startUpNamerPage;
            break;
    
          default:
            return new Container(
              child: new Center(
                  child: new Text(
                      'No page found by page chooser.',
                      style: new TextStyle(fontSize: 30.0)
                  )
              ),
            );
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
            home: new Scaffold(
                body: pageChooser(),
                bottomNavigationBar: new BottomNavigationBar(
                  currentIndex: pageIndex,
                  onTap: (int tappedIndex) { //Toggle pageChooser and rebuild state with the index that was tapped in bottom navbar
                    setState(
                            (){ this.pageIndex = tappedIndex; }
                    );
                  },
                  items: [
                    new BottomNavigationBarItem(
                        title: new Text('Profile'),
                        icon: new Icon(Icons.account_box)
                    ),
                    new BottomNavigationBarItem(
                        title: new Text('Plan'),
                        icon: new Icon(Icons.calendar_today)
                    ),
                    new BottomNavigationBarItem(
                        title: new Text('Startup'),
                        icon: new Icon(Icons.alarm_on)
                    )
                  ],
                )
            )
        );
      }
    }
    

    Or you can make use of widgets like PageView or Stack to achieve the same.

    Hope that helps!

提交回复
热议问题