提问者:小点点

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


一段时间以来,我一直在努力解决这个问题,但无法弄清楚出了什么问题。

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.

我尝试用constnew作为前缀,并将值传递给ClassA构造函数,但没有任何效果。有人能看到我在这里做错了什么吗?


共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
}

这是我能找到的实现你想要的唯一方法,构造函数应该是默认的

这称为规范化构造函数。

匿名用户

为了让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,因为语言团队希望保留在某些时候允许非常量默认值的选项。

匿名用户

如果未指定“订单日期”,请使用“日期现在”。如果指定了订单日期,请使用它。

class Order  {
  final String id;
  final double amount;
  final List cartItems;
  final DateTime? dateTime;

  Order(
      {required this.id,
      required this.amount,
      required this.cartItems,
       dateTime
       })
      :this.dateTime = ( dateTime != null ? dateTime : DateTime.now() );
}


void main() {
  
  var order_use_default_date = Order(id:"1",amount:1000,cartItems:[1,2,3]);
  var order_use_param_date = Order(id:"1",amount:1000,cartItems:[1,2,3],dateTime:DateTime.now().subtract(Duration(days: 2)) );
  
  print(order_use_default_date.dateTime);
  print(order_use_param_date.dateTime);
  
  
}