簡體   English   中英

在 Dart 和 JavaScript 之間傳遞對象列表 — 轉換列表<dynamic>列出<geocoderesult></geocoderesult></dynamic>

[英]Passing a List of objects between Dart and JavaScript — convert List<dynamic> to List<GeocodeResult>

我正在嘗試從 Dart 訪問Google 地圖地理編碼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) {
    // ???
  }),
);

問題在於回調 function 中的results列表類型:

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

將類型設置為GeocodeResult ,我收到一個錯誤:

需要一個List<GeocodeResult>類型的值,但得到一個List<dynamic>類型的值

但是,如果我將類型更改為dynamic ,那么我在 dart 中的回調 function 會收到一個List<NativeJavaScriptObject>

我不知道如何處理NativeJavascriptObject

  • 它不是Map ,所以我不能使用方括號 - result['geometry']
  • 如果我嘗試使用List.cast<GeocodeResult>()那么我得到一個錯誤: dart.notNull() is not a Function
  • 它是 dart object,所以我不能只使用點表示法訪問任意屬性 — result.geometry

歡迎任何和所有的建議,謝謝。

Okay, I've got it working by converting to JSON in JavaScript and then parsing the JSON into a Map in dart:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM