class Foo {
final int x;
Foo([this.x = defValue]); // Compile-time error
static get defValue => 10;
}
错误:
可选参数的默认值必须为常数。
defValue
是一个编译时间常数,因此我应该能够将其值传递给构造函数。
答案 0 :(得分:1)
表达式defValue
不是编译时常量表达式。对其进行评估需要执行getter来获取值,而常量评估则不能执行getter或方法(除了非常具体的允许平台方法列表,例如int.operator+
之外)。通过执行defValue
getter返回的表达式可能本身就是一个编译时常量表达式,但是它是通过非恒定操作返回的。
将defValue
的定义更改为
static const defValue = 10;
然后它应该工作。读取常量声明是一个编译时常量操作。
您参考文档说可以将静态方法用作编译时常量。没错,但这是方法本身,它是常量,仍然不能调用它。 那是:
static int foo(int x) => x;
static const fooRef = foo; // valid!
之所以有效,是因为引用foo
函数 value 是一个常量表达式。
吸气剂不是方法,您不能对吸气剂进行“撕除”。引用它时,您需要执行它的主体,并且在恒定上下文中是不允许的。
答案 1 :(得分:0)
我的猜测是defValue
在编译时是未知的(因为它是一个吸气剂,而不是一个常量),因此您应该使用static const int defValue = 10
这样的常量变量,或者像这样初始化类:
class Foo {
final int x;
Foo([int x]) : this.x = x ?? defValue;
static get defValue => 10;
}