必须将展开的小部件放在Flex小部件中

时间:2018-05-09 10:11:31

标签: dart flutter

新的扑动,有人可以告诉我下面的代码enter image description here

有什么问题吗?
  class GamePage extends StatelessWidget {
  int _row;
  int _column;

  GamePage(this._row,this._column);

  @override
  Widget build(BuildContext context) {
    return new Material(
      color: Colors.deepPurpleAccent,
      child:new Expanded(
          child:new GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
        return new Center(
            child: new CellWidget()
        );
      }),) )


    );
  }
}

附加错误屏幕截图。

4 个答案:

答案 0 :(得分:16)

崩溃

这崩溃是因为Expanded不是Flex小部件的后代:

Container(
  child: Expanded(
    child: MyWidget(),
  ),
)

可接受

此处扩展 Flex的后代:

Flex(
  direction: Axis.horizontal,
  children: [
    Expanded(
      child: MyWidget(),
    ),
  ],
)

行还是Flex小部件:

Row(
  children: [
    Expanded(
      child: MyWidget(),
    ),
  ],
)

列也是如此:

Column(
  children: [
    Expanded(
      child: MyWidget(),
    ),
  ],
)

另一种选择是摆脱扩展小部件:

Container(
  child: MyWidget(),
)

答案 1 :(得分:13)

您没有Flex祖先。

  

Expanded小部件必须是Row,Column或Flex的后代,并且从Expanded小部件到其封闭的Row,Column或Flex的路径必须只包含StatelessWidgets或StatefulWidgets(不是其他类型的小部件,如RenderObjectWidgets )。

我不确定您的情况是否需要Expanded。但是删除它或将其包裹在Column中可以解决问题。

答案 2 :(得分:0)

使用Expanded小部件会使RowColumnFlex的子级展开以填充主轴上的可用空间(例如,水平放置Row或垂直放置Column)。如果扩展了多个子项,则会根据flex因子在其中分配可用空间。

要解决上述问题,您只需将Expanded小部件包装在flex小部件内,如下所示:

 @override
 Widget build(BuildContext context) {
   return new Material(
       color: Colors.deepPurpleAccent,
       child:Column(
         children: <Widget>[
           new Expanded(
               child:new GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
                 return new Center(
                     child: new CellWidget()
                 );
               }),) )
         ],
       )


   );
 }

答案 3 :(得分:0)

另一个与错误相关但使用 Expanded 和 ConstrainedBox 的简单示例:

代码:

Column(
  children:  [
    ConstrainedBox(
      child: Expanded(
        child: ...
      )
    )
  ]

错误信息:

<块引用>

[...] 通常,这意味着 Expanded 小部件具有错误的祖先 RenderObjectWidget。通常,扩展小部件直接放置在 Flex 小部件内。 有问题的 Expanded 当前放置在 ConstrainedBox 小部件中。

为什么代码不能正常工作? 在此示例中,Expanded 必须将 Column 作为直接父级(这是兼容的父级类型)。

解决办法:

Column(
  children:  [
   Expanded(
      child: ConstrainedBox(
        child: ...
      )
    )
  ]