【问题标题】:Passing a List of objects between Dart and JavaScript — convert List<dynamic> to List<GeocodeResult>在 Dart 和 JavaScript 之间传递对象列表 — 将 List<dynamic> 转换为 List<GeocodeResult>
【发布时间】:2021-03-25 01:54:17
【问题描述】:

我正在尝试从 Dart 访问 Google Maps Geocoding JavaScript API。

我有这段代码,它使用js package 转换为 Dart:

@JS('google.maps')
library google_maps;

import 'package:js/js.dart';

@JS()
class Geocoder {
  external Geocoder();
  external geocode(GeocodeOptions options, void Function(List<GeocodeResult> results, String status) callback);
}

@JS()
@anonymous
class GeocodeResult {
  // ...
}

...我从我的应用程序中这样调用它:

geocoder.geocode(
  GeocodeOptions(
    address: address,
    region: region,
  ),
  allowInterop((results, status) {
    // ???
  }),
);

问题在于回调函数中results列表的类型:

void Function(List<GeocodeResult> results, String status)

类型设置为GeocodeResult,我得到一个错误:

应为 List&lt;GeocodeResult&gt; 类型的值,但得到 List&lt;dynamic&gt; 类型的值

但是如果我将类型更改为dynamic,那么我在dart 中的回调函数会收到List&lt;NativeJavaScriptObject&gt;

我不知道如何处理 NativeJavascriptObject

  • 不是Map,所以我不能使用方括号——result['geometry']
  • 如果我尝试使用List.cast&lt;GeocodeResult&gt;(),则会收到错误消息:dart.notNull() 不是函数
  • 它是一个 dart 对象,所以我不能只使用点符号访问任意属性 — result.geometry

欢迎提出任何建议,谢谢。

【问题讨论】:

    标签: javascript flutter dart flutter-web dart-js-interop


    【解决方案1】:

    好的,我已经通过在 JavaScript 中转换为 JSON,然后在 dart 中将 JSON 解析为 Map 来实现它:

    geocoder.geocode(
      GeocodeOptions(
        address: address,
        region: region,
      ),
      allowInterop((results, status) {
        final list = List<Map<String, dynamic>>();
        results.forEach((jsObject) {
          //Convert NativeJavascriptObject to Map by encoding and decoding JSON
          final json = stringify(jsObject);
          final map = Map<String, dynamic>.from(jsonDecode(json));
          list.add(map);
        });
      }),
    );
    

    这使用下面的stringify(),它从JavaScript 调用JSON.stringify()

    @JS('JSON.stringify')
    external String stringify(Object obj);
    

    【讨论】:

    • 那么最后一段代码有两行......那到底是哪里?
    • 顶级范围内同一文件中的某处(顶部有@JS() library...
    猜你喜欢
    • 2021-03-29
    • 2021-03-27
    • 2020-06-02
    • 2021-05-20
    • 2020-09-04
    • 2021-12-04
    • 2021-05-27
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多