繁体   English   中英

Dart中等效的Javascript“地图”是什么?

[英]What is the Javascript “map” equivalent in Dart?

我是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]));
}

因为你在map使用dynamic而不是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编译器应将其选为类型检查错误,但直到运行时才会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM