我正在使用新的js
包和dart 2sdk为chrome.storage.local.set
编写一个自定义的dart到js interop。
Dart中的Map
与JavaScript中的对象不是一回事,但每次开发人员想要使用面向公共的API时,强迫他们编写抽象类也不是正确的事情。
因此,我正在寻找一种将dart Map转换为不需要编写抽象类的JavaScript对象的方法。
使用dart:js
很容易将dart Map转换为JS对象,但是使用新的js
包,我还没有看到任何将dart Map动态转换为js对象的示例。
发布于 2018-08-12 09:45:43
我能够通过编写这个将Map转换为js对象的函数来解决这个问题。
import 'package:js/js_util.dart' as js;
Object mapToJSObj(Map<dynamic,dynamic> a){
var object = js.newObject();
a.forEach((k, v) {
var key = k;
var value = v;
js.setProperty(object, key, value);
});
return object;
}
发布于 2020-04-26 15:27:36
接受答案的略微修改版本,它也处理嵌套地图。我还添加了另一种转换方式的解决方案:从Javascript对象到Dart Map。
import 'package:js/js.dart';
import 'package:js/js_util.dart';
Object mapToJsObject(Map map){
var object = newObject();
map.forEach((k, v) {
if (v is Map) {
setProperty(object, k, mapToJsObject(v));
} else {
setProperty(object, k, v);
}
});
return object;
}
Map jsObjectToMap(dynamic jsObject) {
Map result = {};
List keys = _objectKeys(jsObject);
for (dynamic key in keys) {
dynamic value = getProperty(jsObject, key);
List nestedKeys = objectKeys(value);
if ((nestedKeys ?? []).isNotEmpty) {
//nested property
result[key] = jsObjectToMap(value);
} else {
result[key] = value;
}
}
return result;
}
List<String> objectKeys(dynamic jsObject) {
if (jsObject == null || jsObject is String || jsObject is num || jsObject is bool) return null;
return _objectKeys(jsObject);
}
@JS('Object.keys')
external List<String> _objectKeys(jsObject);
https://stackoverflow.com/questions/51804476
复制相似问题