Search code examples
flutterappbarscaffoldflutter-bottomnavigation

Flutter BottomNavigationBar stackoverflow


i'm starting with Flutter and i'm struggling with the navigationBar, if i add the body i keep getting a stackOverflow. If i don't add the body everything is fine. Error:

    The following StackOverflowError was thrown building DefaultTextStyle(debugLabel: (englishLike body1 2014).merge(blackMountainView bodyText2), inherit: false, color: Color(0xdd000000), family: Roboto, size: 14.0, weight: 400, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip):
Stack Overflow

The relevant error-causing widget was: 
  Scaffold Scaffold:file:///Users/salvatorelafiura/git/energy_flutter/lib/screen/main.dart:104:12
When the exception was thrown, this was the stack: 
#0      new Uint8List (dart:typed_data-patch/typed_data_patch.dart:2201:3)
#1      _createTables.<anonymous closure> (dart:core/uri.dart:3872:60)
#2      new _GrowableList.generate (dart:core-patch/growable_array.dart:133:28)

Code of the current widget, 3 screens one bottomNavigation.

Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widgetTitle.elementAt(selectedIndex)),
            actions: <Widget>[
              IconButton(
                icon: const Icon(
                  Icons.logout,
                  color: Colors.white,
                ),
                onPressed: () {
                  signOut();
                },
              )
            ],
          ),
          body: Center(
            child: IndexedStack(index: selectedIndex, children: tabPages),
          ),
          bottomNavigationBar: BottomNavigationBar(
            items: const <BottomNavigationBarItem>[
              BottomNavigationBarItem(icon: Icon(Icons.home), label: "Pratica"),
              BottomNavigationBarItem(icon: Icon(Icons.mail), label: "Messages"),
              BottomNavigationBarItem(icon: Icon(Icons.person), label: "Profilo"),
            ],
            currentIndex: selectedIndex,
            onTap: onItemTapped,
            backgroundColor: Colors.white,
            fixedColor: Colors.blue,
            selectedLabelStyle: const TextStyle(color: Colors.red, fontSize: 20),
            unselectedFontSize: 16,
            selectedIconTheme:
                const IconThemeData(color: Colors.blue, opacity: 1.0, size: 30.0),
            unselectedItemColor: Colors.grey,
            unselectedLabelStyle: const TextStyle(fontSize: 18, color: Colors.pink),
          ), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }

Solution

  • Create a Separate Class "Bottom" and Place the whole code of your Bottomnavigationbar inside that class then at every Screen just Call inside the Scaffold like:

    bottomNavigationBar: Bottom();
    

    Then Declare your int selectedIndex = 0; Globally it will works fine.

    Modify the Given code:

    import 'package:flutter/material.dart';
    
    int _selectedIndex = 0;
    
    class Bottom extends StatefulWidget {
      @override
      _BottomState createState() => _BottomState();
    }
    
    class _BottomState extends State<Bottom> {
      @override
      Widget build(BuildContext context) {
        return BottomNavigationBar(
            
            showSelectedLabels: true, // <-- HERE
            showUnselectedLabels: true,
            backgroundColor: Color(0xff38547C),
            type: BottomNavigationBarType.fixed,
            currentIndex: _selectedIndex,
            selectedItemColor: Color(0xFF1C2834),
            unselectedItemColor: Colors.white,
            items: [
              BottomNavigationBarItem(
                icon: const Icon(
                  Icons.home,
                ),
                label: "Home",
              ),
              BottomNavigationBarItem(
                icon: ImageIcon(
                  AssetImage("assets/images/ball.png"),
                ),
                label: "Matches",
              ),
              BottomNavigationBarItem(
                  icon: const Icon(
                    Icons.live_tv,
                  ),
                  label: "Live"),
              BottomNavigationBarItem(
                  icon: Icon(
                    Icons.poll,
                  ),
                  label: "Ranking"),
              BottomNavigationBarItem(
                  icon: Icon(
                    Icons.more_horiz,
                  ),
                  label: "More"),
            ],
            onTap: (int index) {
              setState(() {
                _selectedIndex = index;
              });
              if (_selectedIndex == 0) {
                var route =
                    MaterialPageRoute(builder: (BuildContext context) => Home());
                Navigator.of(context).push(route);
              } else if (_selectedIndex == 1) {
                var route =
                    MaterialPageRoute(builder: (BuildContext context) => Matches());
                Navigator.of(context).push(route);
              } else if (_selectedIndex == 2) {
                var route =
                    MaterialPageRoute(builder: (BuildContext context) => Live());
                Navigator.of(context).push(route);
              } else if (_selectedIndex == 3) {
                var route =
                    MaterialPageRoute(builder: (BuildContext context) => Ranking());
                Navigator.of(context).push(route);
              } else if (_selectedIndex == 4) {
                var route =
                    MaterialPageRoute(builder: (BuildContext context) => More());
                Navigator.of(context).push(route);
              }
            });
      }
    }