错误:实例成员 ... 无法在初始化程序中访问
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.
在我看来String
和int
之间的连接是正确的吗?
【问题讨论】:
【参考方案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
应该始终依赖于jsonTextPref
和jsonTextSuff
,这将是合适的,永远不需要有一个独立的值,并且如果jsonText
可以接受返回一个每次访问新对象。
【讨论】:
【参考方案3】:您只能使用常量表达式作为初始值设定项。 x=this.y
不是常量。
【讨论】:
字段初始化器不需要是常量。例如,这是有效的:import 'dart:math'; var random = Random(); class Foo int x = random.nextInt(100);
以上是关于错误:实例成员 ... 无法在初始化程序中访问的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法在字段初始化程序中访问“this”以读取“_endeks”[重复]