【问题标题】:What is the Javascript "map" equivalent in Dart?Dart 中的 Javascript“地图”等价物是什么?
【发布时间】:2019-04-19 08:10:41
【问题描述】:

我是 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) =>... 不应该是BoxType boxType 吗?
  • 我从一个动态列表映射,这就是为什么参数是动态的。我返回一个BoxType,所以我不明白这里的问题
  • 如果你没有像data["boxTypes"].map((boxType) =&gt; BoxType.fromDynamic(boxType)).toList();那样给出地图参数的类型,你会得到同样的错误吗?
  • 我刚试过,它返回同样的错误:/

标签: javascript dart


【解决方案1】:

因为您在 map 中使用的是 dynamic,而不是 BoxType - 错误提示 'List&lt;dynamic&gt;' is not a subtype of 'List&lt;BoxType&gt;',所以只需修复此问题即可:

List<BoxType> boxTypes = data["boxTypes"].map((BoxType boxType) => BoxType.fromDynamic(boxType)).toList();

【讨论】:

  • data["boxTypes"] 是一个动态对象,这就是我在返回中使用.fromDynamic 的原因。如果我按照你说的做,我会收到这个错误:_TypeError (type '(BoxType) =&gt; BoxType' is not a subtype of type '(dynamic) =&gt; dynamic' of 'f')
【解决方案2】:

这段代码运行没有问题:

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&lt;String, dynamic&gt;,我会遇到与您相同的错误...

您能否验证您的地图类型将值声明为List

Dart 编译器应该将其视为类型检查错误,但这似乎直到运行时才会发生。

【讨论】:

  • 感谢您的回复。我无法更改地图的类型,它是来自 HTTP 调用的动态。对我来说,它看起来像 Dart 中的一个错误,map 的返回返回一个 BoxType 对象,它不应该再将其视为动态的。
  • 但是data 对象的类型是什么?
  • 一个动态的,表示一个具有多个属性的对象,包括一个BoxType列表
  • 当你输入动态的东西时,Dart 会让你调用它的方法,只有在类型错误时才会在运行时失败...不要直接使用动态,将其转换为你认为的类型是的,首先检查 if (obj is X) 以避免错误。
猜你喜欢
  • 2014-10-08
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 2019-07-17
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多