错误:实例成员 ... 无法在初始化程序中访问

Posted

技术标签:

【中文标题】错误:实例成员 ... 无法在初始化程序中访问【英文标题】: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 之间的连接是正确的吗?

【问题讨论】:

【参考方案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);

以上是关于错误:实例成员 ... 无法在初始化程序中访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在初始化程序颤动中从小部件访问传递的值

错误:无法在字段初始化程序中访问“this”以读取“_endeks”[重复]

无法在属性初始化程序中使用实例成员,将变量设置为惰性不起作用

错误不能在属性初始化程序中使用实例成员“xxx”

在初始化程序错误中只能访问静态成员

Swift 不能在属性初始化器中使用实例成员