dart - 错误 : Only static members can be accessed in

我有这样的东西。我很难理解这个错误。 为什么在此处访问 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/

相关文章:

flutter - 在 Flutter 中显示用户友好的错误页面而不是异常

dart - 如何强制 Flutter 重建/重绘所有小部件?

flutter - 点击 AppBar 打开抽屉

flutter - 在 Flutter 中更改 TextField 的下划线

android - 让 Flutter 应用全屏显示

dart - 为什么 setState 会关闭?

flutter - 垂直视口(viewport)被赋予了无限的高度

android - 如何在 flutter 中制作不透明的教程屏幕?

dart - flutter : Where is the title of Material Ap

dart - 如何在 Flutter 中隐藏 TextField 底部的字母计数器