0

我是新来的。我正在尝试制作一个xo游戏。我仍处于应用程序的第一步。我正在使用 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 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,
     ),
   );
  }
}

提前致谢。

4

1 回答 1

1

那是因为你以错误的方式连接构造函数,你没有从对象构造State对象,也就是说,构造对象的工作StatefulWidget是构造State对象。您构造一个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.fieldNameState对象内部使用来访问对象中的任何字段StatefulWidget,请参阅我使用widget.onTapwidget.choiceStatefulWidget上面获取字段数据。

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为 a SatelessWidget,这两种方法都可以解决您的问题,因此这取决于您是否需要保留StatefulWidget

于 2018-08-29T19:48:32.713 回答