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

问题描述 投票:0回答:1

我是新来的人。而我正试图制作一个x o游戏。我还在应用程序的第一步。我正在使用gridview.count来制作游戏的布局。问题是有状态小部件(choice,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,
     ),
   );
  }
}

提前致谢。

gridview flutter statefulwidget
1个回答
1
投票

那是因为你以错误的方式连接构造函数,你没有从State对象构造对象,也就是StatefulWidget的工作是构造State对象。你构造了一个名为StatefulWidgetGridCell实例,因此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对象内部的State来访问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

© www.soinside.com 2019 - 2024. All rights reserved.