Как работать с виджетом с состоянием в детстве для 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
или нет.