断言失败:第549行,第12个位置:'child.hasSize'不正确。

8

我是Flutter新手。我正在使用底部导航视图。在Dashboard类中,有底部导航。底部导航的第一个是Home类,它具有选项卡视图。选项卡视图的第一页是NewRequest类。当应用程序首次运行时,选项卡视图的第一页没有加载,但当进入其他类并返回到Home时,New Request被加载。如何在应用程序首次运行时加载选项卡视图的第一页?我已经按照以下方式实现:

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;
        }
      });
    },
  ) ;
 }
}

我的主页

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")],
            )
          ],
        )),
  ),
);
}

新请求页面。
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,
                  ),
                )),
              ])
        ],
      ),
    ));
   }
4个回答

6

虽然有些晚了,但我刚遇到了同样的问题。我不确定如何解决您具体的例子,但我在这里发布我的解决方案,希望能帮助其他人。

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

我遇到了关于TextField的问题 - 失败的断言: ... 'hasSize.'
TextField没有明确的尺寸选项,而是继承自其父级组件。 (这篇sizing a TextField中的帖子假设了这一点。) 如果父级组件也没有指定特定的大小(例如Row,Column,垂直ListView),则可能会出现错误。正如你在上面的代码中看到的,我通过将TextField包装在一个Expanded Widget中来解决这个问题,这个Expanded Widget填充其父级组件以获取其自身的尺寸,并将其传递给TextField


1
对我来说,是在listView的一个元素中添加了扩展小部件,所以我将其移除后,它就可以正常工作了。

0

把出现错误的小部件放在一个指定高度的容器中,可以解决问题。这个方法对我很有效。


0

@Nbn 试着在“我的主页”文件的选项卡栏小部件中删除isScrollable属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接