如何在构造函数中将常量值分配为默认值

时间:2020-08-20 11:14:37

标签: dart

class Foo {
  final int x;

  Foo([this.x = defValue]); // Compile-time error

  static get defValue => 10; 
}

错误:

可选参数的默认值必须为常数。

defValue是一个编译时间常数,因此我应该能够将其值传递给构造函数。

2 个答案:

答案 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; 
}