Gridview 如何将有状态小部件作为grid.tile的子部件处理

Gridview 如何将有状态小部件作为grid.tile的子部件处理,gridview,flutter,statefulwidget,Gridview,Flutter,Statefulwidget,我是个新手。我想做一个x o游戏。我仍然处于应用程序的第一步。我正在使用gridview.count来制作游戏的布局。问题在于有状态widgetchoice的属性,而在gridview磁贴中没有定义onTap。这是我的密码 return Scaffold( appBar: AppBar(title: Text('Tic Tac Toe')), body: GridView.count( crossAxisCount: 3,

我是个新手。我想做一个x o游戏。我仍然处于应用程序的第一步。我正在使用gridview.count来制作游戏的布局。问题在于有状态widgetchoice的属性,而在gridview磁贴中没有定义onTap。这是我的密码

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 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获取字段数据


或者,您可以将GridCell转换为SatelessWidget,这两种方法都可以解决您的问题,因此这取决于您是否需要保留StatefulWidget。

您遇到了什么错误?我错误地使用行-列视图而不是GridView创建了相同的tic-tac-toe。但它可能会帮助您,因为您的问题主要是onTap和choice
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,
     ),
   );
  }
}