Как работать с виджетом с состоянием в детстве для grid.tile - PullRequest
0 голосов
/ 29 августа 2018

Я новичок, чтобы трепетать. и я пытаюсь сделать игру х о. Я все еще на самых первых шагах приложения. Я использую gridview.count, чтобы сделать макет игры. Проблема в том, что свойства виджета с состоянием (выбор, 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,
     ),
   );
  }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Это потому, что вы неправильно подключили конструктор, вы не создаете объект из объекта 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.fieldName изнутри объекта State для доступа к любому полю в StatefulWidget объекте, см. Я использую 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 в SatelessWidget, вместо этого оба подхода решат вашу проблему, поэтому все зависит от того, нужно ли вам оставить StatefulWidget или нет.

...