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

时间:2018-08-29 18:29:43

标签: gridview flutter statefulwidget

我是新手。我正在尝试制作x o游戏。我仍处于应用程序的第一步。我正在使用gridview.count来制作游戏的布局。问题是有状态窗口小部件(choice,onTap())的属性未在gridview磁贴中定义。这是我的代码

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,
     ),
   );
  }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

那是因为您以错误的方式连接了构造函数,所以您不是从State对象构造该对象,也就是说StatefulWidget的工作是构造{{1 }}对象。您构造了一个名为State的{​​{1}}的实例,因此StatefulWidget需要将字段和构造函数移到其中。

简而言之,您需要像这样将GridCell字段和构造函数移动到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(); } } 访问widget.fieldName对象中的任何字段,请参见我使用StateStatefulWidget获取字段来自我上面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