【问题标题】:Error: The instance member ... can't be accessed in an initializer错误:实例成员 ... 无法在初始化程序中访问
【发布时间】:2022-01-15 23:53:33
【问题描述】:

为什么会有这段代码:

class _SequentialTextPageState {
  String jsonTextPref = 'seqtext';
  int jsonTextSuff = 10;
  String jsonText = jsonTextPref + jsonTextSuff.toString();
}

产生这些错误?

Error: The instance member 'jsonTextPref' can't be accessed in an initializer.

Error: The instance member 'jsonTextSuff' can't be accessed in an initializer.

在我看来Stringint 之间的连接是正确的吗?

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 不允许字段初始化器引用对象本身。在开始创建对象之前,必须始终完全初始化字段。 初始化器只能访问静态和顶级变量,不能访问对象本身的任何实例变量。

    使用 null 安全性,您将被允许编写 late String jsonText = this.something + this.other;。然后,该字段在第一次读取或写入之前不会被初始化,这必然是在对象本身创建之后。

    【讨论】:

      【解决方案2】:

      Dart initializes objects in multiple phases。直接初始化成员(“字段初始化器”)发生在对象初始化的早期,在this 生效之前,因此该阶段无法初始化依赖于对象其他部分的成员。

      Dart 提供了multiple ways to initialize members,因此如果一个成员需要依赖另一个成员,您可以在稍后阶段通过使用不同的机制(例如在构造函数主体中或使用late 关键字)对其进行初始化。

      请注意,在某些情况下,您可以考虑将成员 variable 替换为只读 getter。例如,在您的情况下,也许您可​​以使用:

      String get jsonText => jsonTextPref + jsonTextSuff.toString();
      

      如果jsonText 应该始终依赖于jsonTextPrefjsonTextSuff,这将是合适的,永远不需要有一个独立的值,并且如果jsonText 可以接受返回一个每次访问新对象。

      【讨论】:

        【解决方案3】:

        您只能使用常量表达式作为初始值设定项。 x=this.y 不是常量。

        【讨论】:

        • 字段初始化器不需要是常量。例如,这是有效的:import 'dart:math'; var random = Random(); class Foo { int x = random.nextInt(100); }
        猜你喜欢
        • 1970-01-01
        • 2020-12-12
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多