一段时间以来,我一直在努力做到这一点,却无法弄清楚出什么问题了。
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构造函数作为前缀,但是没有任何效果。有人可以在这里看到我在做什么错吗?
欢呼
答案 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);
}