我正在开发一个生成 dart 代码的工具,但在执行具有循环依赖性的程序时遇到了这个运行时错误。
file.dart:xx:xx: Error: Constant evaluation error:
this.b = const B(),,
^
file:xx:xx: Context: Constant expression depends on itself.
this. A = const A(),
这是我正在执行的程序的简化:
class A {
final B b;
const A({
this.b = const B(),
});
}
class B {
final A a;
const B({
this.a = const A(),
});
}
如您所见,A 和 B 之间存在循环依赖。
我尝试将 const 关键字删除为:
class A {
final B b;
A({
this.b = B(),
});
}
class B {
final A a;
B({
this.a = A(),
});
}
但是,我得到了一个编译时错误:
The default value of an optional parameter must be constant. dart(non_constant_default_value)
你知道如何处理这类问题吗?或者 Dart 中是否有等价于 forwardref 的东西?
你的方法是行不通的,因为当你构造
A()
时,它会构造一个B()
,它会构造A()
,它会构造B()
,无穷无尽。
如果您希望
A
的单个实例和 B
的单个实例相互引用,您需要让它们中的一个传递对自身的引用,而不是让另一个构造函数创建一个新的实例初始类型。你不能在初始化列表中传递this
(this
在那个时候还无效),所以它必须在构造函数体中完成,并且初始化的final
成员需要是late
.构造函数体也意味着两个类都不能有const
构造函数。
如果你想要
const
构造函数,因为你想要 A()
和 B()
作为默认参数,典型的方法是使用 null
作为默认参数.
class A {
late final B b;
A({B? b}) {
this.b = b ?? B(a: this);
}
}
class B {
late final A a;
B({A? a}) {
this.a = a ?? A(b: this);
}
}
使用工厂构造函数怎么样?
class A {
final B b;
factory A() => A._(B());
A._(this.b);
}
class B {
final A a;
factory B() => B._(A());
B._(this.a);
}