我有这样的东西。我很难理解这个错误。
为什么在此处访问 filterController
会在此处出现此错误,但如果我在构建中移动当前整个 TextFormField
创建(在注释 A 和 B 之间),则不会出现此错误方法?如何在 build 方法中移动整个 TextFormField
使 filterController
静态并解决此问题?
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin
{
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
//----A
TextFormField email = new TextFormField(
keyboardType: TextInputType.emailAddress,
controller: filterController, ------>ERROR : Error: Only static members can be accessed in initializers
);
//----B
@override
Widget build(BuildContext context)
{
return new Scaffold(
appBar: new AppBar(..),
);
}
}
我该如何解决这个问题?
最佳答案
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
TextFormField email = ...
...
是一个初始化器,此时无法访问 this
。
初始化程序在构造函数之前执行,但 this
只允许在调用 super 构造函数(在您的示例中隐含)完成后访问。
因此,仅允许在构造函数主体(或更高版本)中访问 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
字段不需要为final时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;
关于dart - 错误 : Only static members can be accessed in initializers what does this mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145150/