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

时间:2018-08-18 09:25:08

标签: dart

一段时间以来,我一直在努力做到这一点,却无法弄清楚出什么问题了。

enum MyEnum { a, b }

class ClassA {
  final MyEnum myEnum;
  ClassA({this.myEnum = MyEnum.a});
}

class ClassB {
  final ClassA classA;
  ClassB({this.classA = ClassA()}); // ClassA expression is underlined with red
}

IDE(Visual Studio代码)抱怨:

[dart] Default values of an optional parameter must be constant.

我试图用const,new和将值传递给ClassA构造函数作为前缀,但是没有任何效果。有人可以在这里看到我在做什么错吗?

欢呼

3 个答案:

答案 0 :(得分:3)

要使ClassA能够创建常量值,必须将构造方法标记为const。

enum MyEnum { a, b }

class ClassA {
  final MyEnum myEnum;
  const ClassA({this.myEnum = MyEnum.a});  // <- constructor is const.
}

class ClassB {
  final ClassA classA;
  ClassB({this.classA = const ClassA()}); // <- creation is const
}

即使只允许使用常量值作为默认值,也需要写const来创建对象。语言不会自动在该位置插入const,因为语言团队希望保留在某些时候允许非恒定默认值的选项。

答案 1 :(得分:3)

尝试

enum MyEnum { a, b }

class ClassA {
  final MyEnum myEnum;
  ClassA({this.myEnum});
}

class ClassB {
  final ClassA classA;
  ClassB({this.classA}); // ClassA expression is underlined with red
}

不需要'='运算符。当您将该值传递给构造函数时,它将自动分配该值。

仅当需要将默认值传递给变量时才使用'='运算符,从而使它们成为可选参数。

修改

enum MyEnum { a, b }

class ClassA {
  final MyEnum myEnum;
  const ClassA({this.myEnum = MyEnum.a});
}

class ClassB {
  final ClassA classA;
  ClassB({this.classA = const classA()}); // ClassA expression is underlined with red
}

这是我能找到的达到目的的唯一方法,构造函数应为默认

这称为canonicalized构造函数。

答案 2 :(得分:0)

你试过了吗?

class ClassB {
  final ClassA _classA;
  ClassB({ClassA classA}): _classA = classA ?? ClassA();
}

假设您想将空列表设置为列表成员的默认值,将“const”添加到该默认值,将阻止诸如 add() 等任何操作。在这种情况下,您可以使用

class A{
  List<int> numbers;

// will raise : Uncaught Error: Unsupported operation: add
// when you call the addEle() method
//   A({this.numbers= const []});  
    A({var passedNumbers}) : this.numbers = passedNumbers??[];
    void addEle(int n){
      numbers.add(n);
    
  }
  }

void main() {
  
  var obj = A();
  obj.addEle(5);

}