错误:在初始化程序中只能访问静态成员,这是什么意思?

Mis*_*tyD 24 dart flutter

我有类似的东西.我很难理解这个错误.为何访问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)

  • 感谢您现在解释这一点,这绝对是有道理的。 (2认同)

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)