我正在尝试创建一个类构造函数,其中的唯一参数是Map类型。
class ProductManager extends StatefulWidget {
final Map initialProduct;
ProductManager(this.initialProduct = {'title': '', 'image': ''});
}
我遇到了两个错误:
命名参数必须用大括号('{'和'}')括起来。dart(named_parameter_outside_group)
可选参数的默认值必须为 constant.dart(non_constant_default_value)
通过以下方式更改代码,我解决了第二个错误:
ProductManager(this.initialProduct = const {'title': '', 'image': ''});
我在做什么错?为什么Map变量与其他类型不同?
答案 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
}