从Javascript数组创建Dart列表

6
我正在尝试学习客户端Dart,之前从事服务端的Java EE开发。我在将一个现有JavaScript库中的数组转换为Dart List时遇到了问题。
我试图通过在使用Google Maps的JavaScript互操作示例上构建来学习。在Google的Maps API文档中,DirectionsLeg对象的step属性返回:

包含此路段中各个步骤信息的DirectionsSteps数组

我该如何将这个var转换为Dart List?我已经尝试了以下方法:
final List<maps.DirectionsStep> steps = List.from(directionsLeg.steps);

但是Dart编辑器告诉我:List类中“from”方法无法解析。我的导入如下:
import 'dart:html';
import 'dart:core';
import 'package:js/js.dart' as js;

我在做什么错了吗?这是否可能,还是我必须接受使用一个“var”?
1个回答

8

目前在js-interop中没有内置的方法可以使用Dart List来处理返回的js Array

directionsLeg.steps返回一个类似于js Arrayjs.Proxy。您可以像这样对其进行迭代:

final steps = directionsLeg.steps;
for (var i = 0; i < steps.length ; i++) {
  final step = steps[i];
  // do the job with step
}

如果您确实想使用Dart List,您可以使用类似以下方式将js Arrayjs.Proxy转换为Dart List
List<js.Proxy> convertToList(js.Proxy arrayProxy){
  final result = new List<js.Proxy>();
  for (var i = 0; i < arrayProxy.length ; i++) {
    result.add(arrayProxy[i]);
  }
  return result;
}

关于你的代码:

  • 你不能定义List<maps.DirectionsStep>maps.DirectionsStep不是一个类型,它是js上的google.maps.DirectionsStepjs.Proxy(而且它实际上并不存在-只有一个容器js对象{})。
  • List.from(...):在这里,你试图调用DartList对象的静态方法from。这就是你得到错误的原因。List.from实际上是一个工厂命名构造函数,必须使用new关键字(new List.from(otherIterable))。

感谢对代码的评论 - 我非常喜欢这种语言,但是与Java相比的微妙差异让我经常犯错,我把命名构造函数当作静态方法处理就是一个很好的例子。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接