Failed assertion: line 549 pos 12: 'child.hasSize': is not true

Nbn picture Nbn · Jan 4, 2020 · Viewed 12.6k times · Source

I am new to Flutter. I am using bottom navigation view . At the Dashboard class , there is the bottomnavigaton. The first of bottom navigation is Home class which have the tab view. The first page of the tabview is the NewRequest class. When the application is first run, the first page of the tab view is not loaded but when going in other class and come back to the Home, the New Request is loaded. How to load the tabview first page when the app is first run? I have implemented as follows:

class Dashboard extends StatefulWidget{

@override
 State<StatefulWidget> createState() {
   return _DashboardState();
 }

}
 class _DashboardState extends State<Dashboard>{

int _currentIndex=0;
bool home=true;
final tabs=[
 Home(),
 Center(child: Text('History')),
 Center(child: Text('Wallet')),
   Center(child: Text('More')),
  ];

 final _title=[
  Center(child: Text("Dashboard"),),
  Center(child:Text("History"),),
  Center(child:Text("Wallet"),),
  Center(child:Text("More"),),];


  @override
   Widget build(BuildContext context) {
    return Scaffold(
        appBar: home ? null :AppBar(
         title: _title[_currentIndex],
         automaticallyImplyLeading: false,
    ),
    body: Container(
    child: tabs[_currentIndex],
  ),
  bottomNavigationBar: _bottomNavigationBar(),
);
}

Widget _bottomNavigationBar(){
 return BottomNavigationBar(
    currentIndex: _currentIndex,
    type: BottomNavigationBarType.fixed,
    backgroundColor: Theme.of(context).primaryColor,
    selectedItemColor: Theme.of(context).accentColor,
    unselectedItemColor: Colors.white,
    items: [
      BottomNavigationBarItem(
        icon: Icon(Icons.home),
        title: Text("Home"),          
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.history),
        title: Text("History"),  
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.account_balance_wallet),
        title: Text("Wallet"), 
      ),
      BottomNavigationBarItem(
        icon: Icon(Icons.menu),
        title: Text("More"),
      )
    ],
    onTap: (index){
      setState(() {
        _currentIndex=index;
        if (index==0) {
          home=true;
        }else{
          home=false;
        }
      });
    },
  ) ;
 }
}

My Home page

class Home extends StatefulWidget {
  @override
   State<StatefulWidget> createState() {
    return _HomeState();
   }
}

 class _HomeState extends State<Home> {
  int index;
  @override
void initState() {
super.initState();
index = 0;
}

final pages = [
NewRequest(),
new Column(
  children: <Widget>[new Text("Accepted Page")],
),
new Column(
  children: <Widget>[new Text("Cooking Page")],
),
new Column(
  children: <Widget>[new Text("Cooked Page")],
)
];

final tabs = [
Text('Request'),
Text('Accepted'),
Text('Cooking'),
Text('Cooked'),
];

@override
Widget build(BuildContext context) {
return new MaterialApp(
  debugShowCheckedModeBanner: false,
  home: new DefaultTabController(
    length: 4,
    initialIndex: 0,
    child: new Scaffold(
        appBar: new PreferredSize(
          preferredSize: Size.fromHeight(56.0),
          child: new Container(
            color: Theme.of(context).primaryColor,
            child: new SafeArea(
              child: Column(
                children: <Widget>[
                  new Expanded(
                    child: new Container(
                        child: new TabBar(
                      unselectedLabelColor: Colors.white,
                      labelColor: Theme.of(context).accentColor,
                      indicatorColor: Theme.of(context).accentColor,
                      isScrollable: true,
                      tabs: List<Widget>.generate(4, (index) {
                        return tabs[index];
                      }),
                    )),
                  ),
                ],
              ),
            ),
          ),
        ),
        body: TabBarView(
          children: [
            NewRequest(),
            new Column(
              children: <Widget>[new Text("Accepted Page")],
            ),
            new Column(
              children: <Widget>[new Text("Cooking Page")],
            ),
            new Column(
              children: <Widget>[new Text("Cooked Page")],
            )
          ],
        )),
  ),
);
}

New Request page

class NewRequest extends StatelessWidget{

@override
Widget build(BuildContext context) {

 return ListView(
    shrinkWrap: true,
    children: <Widget>[_CardView(), _CardView(), _CardView(), _CardView()],
  );    
 }  
}

 Widget _CardView() {
  return Card(
    margin: EdgeInsets.all(15.0),
    elevation: 15.0,
    child: Container(
      height: 185,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Row(
            children: <Widget>[
              Expanded(
                child: FittedBox(
                  child: Image.asset('assets/images/momo.jpg'),
                  fit: BoxFit.fill,
                ),
              ),
              Container(
                  child: Expanded(
                      child: Container(
                margin: EdgeInsets.only(left: 10.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  mainAxisSize: MainAxisSize.max,
                  children: <Widget>[
                    Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Text("Momo", style: TextStyle(fontSize: 16.0))
                      ],
                    ),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Text(
                          "Rs.100",
                          style: TextStyle(fontSize: 16.0),
                        )
                      ],
                    ),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Text(
                          "2 Plate",
                          style: TextStyle(fontSize: 16.0),
                        )
                      ],
                    ),
                  ],
                ),
              )))
            ],
          ),
          Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              crossAxisAlignment: CrossAxisAlignment.end,
              children: <Widget>[
                Expanded(
                    child: Container(
                  margin: EdgeInsets.only(
                      left: 5.0, right: 5.0, top: 5.0, bottom: 2.0),
                  child: RaisedButton(
                    color: Colors.red,
                    child: Text(
                      "Reject",
                      style: TextStyle(color: Colors.white),
                    ),
                    onPressed: () => null,
                  ),
                )),
                Expanded(
                    child: Container(
                  margin: EdgeInsets.only(
                      left: 5.0, right: 5.0, top: 5.0, bottom: 0.0),
                  child: RaisedButton(
                    color: Colors.green,
                    child: Text(
                      "Approve",
                      style: TextStyle(color: Colors.white),
                    ),
                    onPressed: () => null,
                  ),
                )),
              ])
        ],
      ),
    ));
   }

Answer

Koya picture Koya · Aug 28, 2020

This is late but I've just had the same issue. I'm not sure how to solve your specific example but I'm posting my solution to my problem here in hopes that it might help someone else.

return Row(children: [
    Container(child: Text('•'), margin: EdgeInsets.only(left: 25*indentLevel.toDouble(), right: 5),),
    Expanded(child: TextField(
      cursorColor: Colors.black,
      autofocus: true,
    ))
  ]);

My problem was with the TextField - Failed assertion: ... 'hasSize.'
The TextField doesn't have an explicit size option and instead inherits from its parent. (assumed from this post on sizing a TextField using a container.) If the parent also doesn't have a specific size (ex. Row, Column, ListView vertically) then errors can occur. As you can see in my code above, I was able to fix this issue by wrapping the TextField in an expanded Widget, which fills its parent to get its own dimensions which it in turn passes down to the TextField.