我有这样的东西。我很难理解此错误。为什么在filterController此处访问会出现此错误?但是如果我TextFormField在build方法中移动当前整个创建过程(在注释A和B之间),它不会给出此错误?那么如何将整个TextFormField内部构建方法移动到filterController静态并解决此问题?
filterController
TextFormField
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只允许在对超级构造函数的调用(在您的示例中是隐含的)完成后才能访问。因此,仅在构造函数主体(或更高版本)this中允许访问。
...
this
这就是为什么您收到错误消息的原因:
controller: filterController,
访问this.filterController(this如果不显式地写,则是隐式的)。
this.filterController
要解决您的问题(假设email需要是final),可以使用工厂构造函数和构造函数初始化列表:
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通常用于
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;