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()
);
}),) )
);
}
}
附加错误屏幕截图。
答案 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
小部件会使Row
,Column
或Flex
的子级展开以填充主轴上的可用空间(例如,水平放置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: ...
)
)
]