【问题标题】:Only static members can be accessed in initializers, error在初始化程序中只能访问静态成员,错误
【发布时间】:2020-05-02 14:18:16
【问题描述】:

我试图通过变量使列表中的"text" 可变,但我得到一个错误(这是错误的描述:在初始化程序中只能访问静态成员)。我试图理解一个类似的问题,该问题也在 stackoverflow.com (Error: Only static members can be accessed in initializers what does this mean?) 上提出,但我没有明白。谁能告诉我代码中的问题是什么?提前致谢!

var exercisetest = "Hallo";

  var exercises = [
    {"text": exercisetest, "time": 10},
    {"text": exercisetest, "time": 14},
  ];

【问题讨论】:

    标签: list flutter dart


    【解决方案1】:

    在这里,您在练习中使用了 exercisetest 变量,因此您会收到此错误。

    如果您添加 static 关键字,那么您可以像现在一样使用或访问该变量。

    如下:

    static var exercisetest = "Hallo";
    

    但是静态变量将成为类变量意味着,无论您创建多少对象,但所有对象都将共享相同的变量。

    此外,您无法访问该变量 object.exercisetest,您只能使用类名 classname.exercisetest 访问。

    【讨论】:

      【解决方案2】:

      我猜这个例子应该是这样的:

      class A {
        String exercisetest = "Hallo";
      
        List<Map<String, dynamic>> exercises = [
          <String, dynamic>{"text": exercisetest, "time": 10},
          <String, dynamic>{"text": exercisetest, "time": 14},
        ];
      }
      

      这不起作用的原因是Dart中的类不是按变量声明顺序初始化的,而是在谈论类时同时初始化所有字段。

      所以这个错误意味着字段exercisetest没有任何值或还不存在,因此在对象完成之前你不能引用它。

      在我们定义构造函数时可以看到对象创建的这两个步骤:

      class A {
        String exercisetest;
        List<Map<String, dynamic>> exercises;
      
        A() : exercisetest = "Hallo" {
          exercises = [
            <String, dynamic>{"text": exercisetest, "time": 10},
            <String, dynamic>{"text": exercisetest, "time": 14},
          ];
        }
      }
      

      在这个例子中,我们在创建对象之前定义了exercisetest(就像你的代码一样)。但是如果我们在{ } 里面写了一些东西,对象就已经在这里创建了,因此我们可以访问例如exercisetest 并用它来定义exercises

      但是由于对象是在我们设置exercises 时创建的,所以我们不能将exercises 设为最终值,因为必须在创建对象之前设置最终值。

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 2020-02-09
        • 1970-01-01
        • 2020-01-05
        • 2020-01-03
        • 2020-10-26
        • 2019-01-23
        • 2018-11-13
        相关资源
        最近更新 更多