在初始化器中只能访问静态成员,错误

时间:2020-05-02 14:18:16

标签: list flutter dart

我试图通过变量使列表中的"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},
  ];

2 个答案:

答案 0 :(得分:0)

这里您在练习中使用Exercisetest变量,因此您遇到此错误。

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

喜欢以下内容:

static var exercisetest = "Hallo";

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

此外,您不能访问只能使用类名classname.exercisetest访问的变量object.exercisetest。

答案 1 :(得分:0)

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

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设置为final,因为必须在创建对象之前设置最终值。