class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
TextFormField email = ...
...
является инициализатором, и на данный момент нет доступа к this
.
Инициализаторы выполняются до конструктора, но доступ к this
разрешен только после завершения вызова суперконструктора (неявного в вашем примере).
Поэтому только в теле конструктора (или позже) разрешен доступ к this
.
Вот почему вы получаете сообщение об ошибке:
controller: filterController,
доступ this.filterController
(this
неявно, если вы не пишете это явно).
Чтобы обойти вашу проблему (предполагая, что email
должно быть final
), вы можете использовать конструктор фабрики и список инициализатора конструктора:
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
factory SingleTickerProviderStateMixin() =>
new SingleTickerProviderStateMixin._(new TextEditingController(text: "Search"));
SingleTickerProviderStateMixin._(TextEditingController textEditingController) :
this.filterController = textEditingController,
this.email = new TextFormField(
keyboardType: TextInputType.emailAddress,
controller: textEditingController);
TabController _tabController;
final filterController;
final TextFormField email;
или когда поле email
не обязательно должно быть окончательным email
можно инициализировать в списке инициализатора конструктора:
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
SingleTickerProviderStateMixin() {
email = new TextFormField(
keyboardType: TextInputType.emailAddress,
controller: filterController,
);
}
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
TextFormField email;
но в виджетах Flutter initState
обычно используется для этого
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
@override
void initState() {
super.initState();
email = new TextFormField(
keyboardType: TextInputType.emailAddress,
controller: filterController,
);
}
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
TextFormField email;