grid.tile 如何将有状态小部件作为子部件处理
How to deal with a stateful widget as a child for grid.tile
我是 Flutter 新手。我正在尝试制作 x o 游戏。我仍处于该应用程序的最初阶段。我正在使用 gridview.count 来制作游戏的布局。问题是有状态小部件的属性(选择,onTap())未在 gridview tile 中定义。这是我的代码
return Scaffold(
appBar: AppBar(title: Text('Tic Tac Toe')),
body: GridView.count(
crossAxisCount: 3,
crossAxisSpacing: 2.0,
mainAxisSpacing: 2.0,
children: List<Widget>.generate(
9,
(int index) {return new GridTile(
child:GridCell(
choice: _choice,
onTap: ()=>onTap(context),
),
);
})))
而 class 是:
class GridCellState extends State<TicTacToe> {
final String choice;
final VoidCallback onTap;
GridCellState({Key key, this.choice, this.onTap}) :
super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap:onTap,
child:Container(
child: Text(choice),
height:20.0,
color:Theme.of(context).primaryColor,
),
);
}
}
提前致谢。
那是因为你以错误的方式连接了构造函数,你没有从 State
对象构造对象,也就是说 StatefulWidget
的工作是构造 State
对象。您构造了一个名为 GridCell
的 StatefulWidget
实例,因此 GridCell
需要将字段和构造函数移至它。
简而言之,您需要将 GridCellState
字段和构造函数移动到 StatefulWidget
本身,如下所示:
class GridCell extends StatefulWidget {
final String choice;
final VoidCallback onTap;
GridCell({Key key, this.choice, this.onTap}) :
super(key: key);
@override
GridCellState createState() {
return new GridCellState();
}
}
然后使用 State
对象内部的 widget.fieldName
来访问 StatefulWidget
对象中的任何字段,看我使用 widget.onTap
和 widget.choice
来从上面的 StatefulWidget
获取字段数据。
class GridCellState extends State<GridCell> {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap:widget.onTap,
child:Container(
child: Text(widget.choice),
height:20.0,
color:Theme.of(context).primaryColor,
),
);
}
}
或者,您可以将 GridCell
转换为 SatelessWidget
,这两种方法都可以解决您的问题,因此这取决于您是否需要保留 StatefulWidget
。
我是 Flutter 新手。我正在尝试制作 x o 游戏。我仍处于该应用程序的最初阶段。我正在使用 gridview.count 来制作游戏的布局。问题是有状态小部件的属性(选择,onTap())未在 gridview tile 中定义。这是我的代码
return Scaffold(
appBar: AppBar(title: Text('Tic Tac Toe')),
body: GridView.count(
crossAxisCount: 3,
crossAxisSpacing: 2.0,
mainAxisSpacing: 2.0,
children: List<Widget>.generate(
9,
(int index) {return new GridTile(
child:GridCell(
choice: _choice,
onTap: ()=>onTap(context),
),
);
})))
而 class 是:
class GridCellState extends State<TicTacToe> {
final String choice;
final VoidCallback onTap;
GridCellState({Key key, this.choice, this.onTap}) :
super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap:onTap,
child:Container(
child: Text(choice),
height:20.0,
color:Theme.of(context).primaryColor,
),
);
}
}
提前致谢。
那是因为你以错误的方式连接了构造函数,你没有从 State
对象构造对象,也就是说 StatefulWidget
的工作是构造 State
对象。您构造了一个名为 GridCell
的 StatefulWidget
实例,因此 GridCell
需要将字段和构造函数移至它。
简而言之,您需要将 GridCellState
字段和构造函数移动到 StatefulWidget
本身,如下所示:
class GridCell extends StatefulWidget {
final String choice;
final VoidCallback onTap;
GridCell({Key key, this.choice, this.onTap}) :
super(key: key);
@override
GridCellState createState() {
return new GridCellState();
}
}
然后使用 State
对象内部的 widget.fieldName
来访问 StatefulWidget
对象中的任何字段,看我使用 widget.onTap
和 widget.choice
来从上面的 StatefulWidget
获取字段数据。
class GridCellState extends State<GridCell> {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap:widget.onTap,
child:Container(
child: Text(widget.choice),
height:20.0,
color:Theme.of(context).primaryColor,
),
);
}
}
或者,您可以将 GridCell
转换为 SatelessWidget
,这两种方法都可以解决您的问题,因此这取决于您是否需要保留 StatefulWidget
。