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 对象。您构造了一个名为 GridCellStatefulWidget 实例,因此 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.onTapwidget.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