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

mg7*_*g74 16 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
}
Run Code Online (Sandbox Code Playgroud)

IDE (Visual Studio Code) 抱怨:

[dart] Default values of an optional parameter must be constant.
Run Code Online (Sandbox Code Playgroud)

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

干杯

Jas*_*ngh 17

尝试

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

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
}
Run Code Online (Sandbox Code Playgroud)

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

这称为规范化构造函数。


Mar*_*nie 14

如果未指定订单日期,请使用 DateNow。如果指定了订单日期,请使用它。

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);
  
  
}
Run Code Online (Sandbox Code Playgroud)


lrn*_*lrn 6

为了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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,但是 const 类不是完全不同的东西吗?在编译时具有已知规范值并且可用于 switch 语句等的类型?我在这里真正想做的唯一一件事是使用默认值创建类的实例。这在 Dart 中是不可能的吗? (3认同)
  • 没有“const 类”这样的东西。类可能有 `const` 构造函数,这允许它们创建 const *values*(然后类也必须只有 final 字段)。常量值是规范化的,但您可以创建非常量值 - 它不是类的属性,而是您创建单个值的方式。参数默认值必须是常量值。所以,如果你想要一个 `ClassA` 类型的默认值,那么 `ClassA` 必须有一个 const 构造函数(并且只有 final 字段,它已经这样做了)。 (2认同)

Sar*_*nan 6

你有没有尝试过?

class ClassB {
  final ClassA _classA;
  ClassB({ClassA classA}): _classA = classA ?? ClassA();
}
Run Code Online (Sandbox Code Playgroud)

假设您想将空列表设置为列表成员的默认值,将“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);

}
Run Code Online (Sandbox Code Playgroud)