Search code examples
flutterdartflutter-bottomnavigation

Flutter how to disable slide animation in BottomNavigationBar


I am trying to create a BottomNavigationBar in flutter, but I want to disable the slide animation between the pages. If I go from first tab to third tab I want it to open third tab directly, not slide through secondtab and then to thirdtab.

Here is my code:

class MyApp3 extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState3();
  }
}

class _MyAppState3 extends State<MyApp3> {
  @override
  PageController _pageController;

  @override
  void initState() {
    super.initState();
    _pageController = PageController(initialPage: 0);
  }

  @override
  Widget build(BuildContext context) {
    var pages = [FirstTab(), SecondTab(), ThirdTab()];

    var pageView = PageView(
      controller: _pageController,
      physics: NeverScrollableScrollPhysics(),
      children: pages,
    );

    var bottomNav = BottomNavigationBar(
      onTap: (tabIndex) {
        _pageController.jumpToPage(tabIndex);
      },
      items: [
        BottomNavigationBarItem(icon: Icon(Icons.home), label: "Start"),
        BottomNavigationBarItem(
            icon: Icon(Icons.camera_enhance), label: "Second"),
        BottomNavigationBarItem(icon: Icon(Icons.offline_pin), label: "Home"),
      ],
    );

    return MaterialApp(
        home: Scaffold(
      body: pageView,
      bottomNavigationBar: bottomNav,
    ));
  }
}

With this code everything works as I want but the BottomNavigationBarItem doesn’t change when the page changes. It always look like this:

What can I do to make the BottomNavigationBarItem selection change?


Solution

  • Try this.

    class MyApp3 extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _MyAppState3();
      }
    }
    
    class _MyAppState3 extends State<MyApp3> {
      @override
      PageController _pageController;
    
      @override
      void initState() {
        super.initState();
        _pageController = PageController(initialPage: 0);
      }
    
      int _currentIndex = 0;
      @override
      Widget build(BuildContext context) {
        var pages = [FirstTab(), SecondTab(), ThirdTab()];
    
        var pageView = PageView(
          controller: _pageController,
          physics: NeverScrollableScrollPhysics(),
          children: pages,
        );
    
        var bottomNav = BottomNavigationBar(
          onTap: (tabIndex) {
             setState((){_currentIndex = tabIndex;});
            _pageController.jumpToPage(tabIndex);
          },
          currentIndex: _currentIndex,
          items: [
            BottomNavigationBarItem(icon: Icon(Icons.home), label: "Start"),
            BottomNavigationBarItem(
                icon: Icon(Icons.camera_enhance), label: "Second"),
            BottomNavigationBarItem(icon: Icon(Icons.offline_pin), label: "Home"),
          ],
        );
    
        return MaterialApp(
            home: Scaffold(
          body: pageView,
          bottomNavigationBar: bottomNav,
        ));
      }
    }