Как работать с виджетом с состоянием в детстве для grid.tile

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

Решение

Это потому, что вы неправильно соединяете конструктор, вы не создаете объект из 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 или нет.

Другие вопросы по тегам