在 Dart 和 JavaScript 之间传递对象列表 — 将 List<dynamic> 转换为 List<GeocodeResult>

Posted

技术标签:

【中文标题】在 Dart 和 JavaScript 之间传递对象列表 — 将 List<dynamic> 转换为 List<GeocodeResult>【英文标题】:Passing a List of objects between Dart and JavaScript — convert List<dynamic> to 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

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

【问题讨论】:

【参考方案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...

以上是关于在 Dart 和 JavaScript 之间传递对象列表 — 将 List<dynamic> 转换为 List<GeocodeResult>的主要内容,如果未能解决你的问题,请参考以下文章

Dart/Objective-C 和 Dart/Java 之间的交互

在 Flutter 的屏幕之间传递 Hive 框

Dart的特性(JIT 与 AOT、内存分配与垃圾回收、单线程模型)

如何通过 Dart 中的 onTap 函数将值传递到另一个屏幕?

Dart是值传递还是引用传递

如何使用“Fetch API”在 javascript 和 c# 之间传递数据?