Flutter: BottomNavigationBar rebuilds Page on change of tab

后端 未结 5 2010
小蘑菇
小蘑菇 2020-12-13 03:50

I have a problem with my BottomNavigationBar in Flutter. I want to keep my page alive if I change the tabs.

here my implementation

BottomNavigation

5条回答
  •  旧时难觅i
    2020-12-13 04:15

    You need to wrap every root page (the first page you see when you press a bottom navigation item) with a navigator and put them in a Stack.

    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State {
      final int _pageCount = 2;
      int _pageIndex = 0;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: _body(),
          bottomNavigationBar: _bottomNavigationBar(),
        );
      }
    
      Widget _body() {
        return Stack(
          children: List.generate(_pageCount, (int index) {
            return IgnorePointer(
              ignoring: index != _pageIndex,
              child: Opacity(
                opacity: _pageIndex == index ? 1.0 : 0.0,
                child: Navigator(
                  onGenerateRoute: (RouteSettings settings) {
                    return new MaterialPageRoute(
                      builder: (_) => _page(index),
                      settings: settings,
                    );
                  },
                ),
              ),
            );
          }),
        );
      }
    
      Widget _page(int index) {
        switch (index) {
          case 0:
            return Page1();
          case 1:
            return Page2();
        }
    
        throw "Invalid index $index";
      }
    
      BottomNavigationBar _bottomNavigationBar() {
        final theme = Theme.of(context);
        return new BottomNavigationBar(
          fixedColor: theme.accentColor,
          currentIndex: _pageIndex,
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.list),
              title: Text("Page 1"),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.account_circle),
              title: Text("Page 2"),
            ),
          ],
          onTap: (int index) {
            setState(() {
              _pageIndex = index;
            });
          },
        );
      }
    }
    

    The pages will be rebuild but you should separate your business logic from you UI anyway. I prefer to use the BLoC pattern but you can also use Redux, ScopedModel or InhertedWidget.

提交回复
热议问题