如何在类构造函数中为Map类型变量分配默认值?

时间:2019-04-24 22:36:19

标签: dart flutter

我正在尝试创建一个类构造函数,其中的唯一参数是Map类型。

class ProductManager extends StatefulWidget {
  final Map initialProduct;

  ProductManager(this.initialProduct =  {'title': '', 'image': ''});

}

我遇到了两个错误:

  

命名参数必须用大括号('{'和'}')括起来。dart(named_pa​​rameter_outside_group)


  

可选参数的默认值必须为   constant.dart(non_constant_default_value)

通过以下方式更改代码,我解决了第二个错误:

ProductManager(this.initialProduct =  const {'title': '', 'image': ''});

我在做什么错?为什么Map变量与其他类型不同?

3 个答案:

答案 0 :(得分:1)

您只能将默认值赋予可选的命名参数。命名参数以大括号形式包含在构造函数声明中。试试这个:

class ProductManager {
  final Map initialProduct;

  ProductManager({this.initialProduct = const {'title': '', 'image': ''}});
}

答案 1 :(得分:0)

如果为如下所示的可选命名参数提供默认值,则您将无法修改默认常量映射

class MyClass {
  Map myMap;

  MyClass({this.myMap = const {}});
}

main() {
 MyClass a = MyClass();
 a.myMap[0]=1; // Throw error
}

代码将引发此错误,因为您无法修改常量:

未捕获的错误:不支持的操作:无法修改无法修改的地图

要解决此问题,可以在创建myMap的实例时初始化MyClass的值。

class MyClass {
  Map myMap;

  MyClass({this.myMap = const {}});
}

main() {
 MyClass a = MyClass({}); // Provide a non const map
 a.myMap[0]=1; // Will work
}

或者您也不能在构造函数中填写默认值,而是通过直接调用属性或函数来更改地图的值

class MyClass {
  Map myMap = {}; // Provide an empty map 

  MyClass(); // Don't provide a default constructor
}

main() {
 MyClass a = MyClass();
 a.myMap[0]=1; // Will work
}

答案 2 :(得分:-1)

我认为这是更好的变体

class MyClass {
  Map myMap; 

  MyClass({Map myMap})
    : myMap = myMap ?? {};
}

main() {
 MyClass a = MyClass();
 a.myMap[0]=1; // Will work

 // and


 MyClass b = MyClass(myMap: {'3':5});
 b.myMap[0]=1; // Will work too
}