我是Dart的新手,我注意到map
的方法与Javascript中的方法不同。
我正在尝试将动态列表转换为对象列表。
在Javascript中,这将工作:
List<BoxType> boxTypes = data["boxTypes"].map((dynamic boxType) => BoxType.fromDynamic(boxType));
但在Dart,我收到了这个错误:
Exception has occurred.
_TypeError (type 'MappedListIterable<dynamic, dynamic>' is not a subtype of type 'List<BoxType>')
我看到我最后可以像这样做一个.toList()
:
List<BoxType> boxTypes = data["boxTypes"].map((dynamic boxType) => BoxType.fromDynamic(boxType)).toList();
但它会生成此错误:
Exception has occurred.
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<BoxType>')
那么,我应该使用什么而不是map
?
编辑:现在,这就是我正在做的事情,它有点难看,但效果很好
for (var i = 0; i < data["boxTypes"].length; i++) {
boxTypes.add(BoxType.fromDynamic(data["boxTypes"][i]));
}
因为你在你的dynamic
中使用map
,而不是BoxType
- 错误说'List<dynamic>' is not a subtype of 'List<BoxType>'
,所以只是修复它应该工作:
List<BoxType> boxTypes = data["boxTypes"].map((BoxType boxType) => BoxType.fromDynamic(boxType)).toList();
此代码运行没有问题:
void main() {
List dynamicList = [1, 2, "hello", true];
Map<String, List> map = {'boxTypes': dynamicList};
// make sure to check for null with ?. and reeturn an empty list if null
List<BoxType> boxes = map["boxTypes"]?.map((box) => BoxType.fromDynamic(box))?.toList() ?? [];
// same, but a little shorter
//List<BoxType> boxes = map["boxTypes"]?.map(BoxType.fromDynamic)?.toList() ?? [];
print(boxes);
}
class BoxType {
String type;
BoxType(this.type);
static BoxType fromDynamic(value) {
if (value is String) {
return BoxType(value);
}
return BoxType(value?.toString() ?? "no value");
}
String toString() => "BoxType{type=${type}}";
}
但是,如果我将map
的类型更改为Map<String, dynamic>
,我会得到与您相同的错误...
你能否验证地图的类型,将值声明为List
?
Dart编译器应将其选为类型检查错误,但直到运行时才会发生这种情况。