我有类似的东西.我很难理解这个错误.为何访问filterController此处会出现此错误?但是如果我TextFormField在构建方法中移动当前的整个创建(在注释A和B之间),它不会出现此错误?如何移动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(..),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
Gün*_*uer 35
class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
TabController _tabController;
final filterController = new TextEditingController(text: "Search");
TextFormField email = ...
Run Code Online (Sandbox Code Playgroud)
...是一个初始化程序,此时无法访问this.初始化程序在构造函数之前执行,但this只有在完成对超级构造函数(在您的示例中隐式)的调用之后才允许访问它.因此只允许在构造函数体(或更高版本)中访问this.
这就是您收到错误消息的原因:
controller: filterController,
Run Code Online (Sandbox Code Playgroud)
访问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;
Run Code Online (Sandbox Code Playgroud)
或者当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;
Run Code Online (Sandbox Code Playgroud)
但在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;
Run Code Online (Sandbox Code Playgroud)
Rub*_*yan 10
您可以将其保留为一种方法:
Widget getEmailController(){
return new TextFormField(
keyboardType: TextInputType.emailAddress,
controller: filterController,
);
}
Run Code Online (Sandbox Code Playgroud)
并在 UI 中使用它:
body: Container(
child: getEmailController();
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24817 次 |
| 最近记录: |