在 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<GeocodeResult>
类型的值,但得到List<dynamic>
类型的值
但是如果我将类型更改为dynamic
,那么我在dart 中的回调函数会收到List<NativeJavaScriptObject>
。
我不知道如何处理 NativeJavascriptObject
!
Map
,所以我不能使用方括号——result['geometry']
如果我尝试使用List.cast<GeocodeResult>()
,则会收到错误消息: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 之间的交互
Dart的特性(JIT 与 AOT、内存分配与垃圾回收、单线程模型)