将Dart 2映射动态转换为Javascript对象

将Dart 2映射动态转换为Javascript对象,dart,dart-js-interop,Dart,Dart Js Interop,我正在使用新的js包和dart 2SDK,围绕chrome.storage.local.set为js interop编写一个自定义dart Dart中的Map与JavaScript中的对象不是一回事,但强迫开发人员在每次想要使用面向公众的API时编写抽象类也不是一件正确的事情 所以,我正在寻找一种将dart映射转换为JavaScript对象的方法,该对象不需要编写抽象类 使用dart:js很容易将dart映射转换为js对象,但是使用新的js包,我没有看到任何将dart映射动态转换为js对象的示例

我正在使用新的
js
包和dart 2SDK,围绕
chrome.storage.local.set
为js interop编写一个自定义dart

Dart中的
Map
与JavaScript中的对象不是一回事,但强迫开发人员在每次想要使用面向公众的API时编写抽象类也不是一件正确的事情

所以,我正在寻找一种将dart映射转换为JavaScript对象的方法,该对象不需要编写抽象类


使用
dart:js
很容易将dart映射转换为js对象,但是使用新的
js
包,我没有看到任何将dart映射动态转换为js对象的示例。

我能够通过编写将映射转换为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;
}
import'package:js/js_util.dart'作为js;
对象映射到JSOBJ(映射a){
var object=js.newObject();
a、 forEach((k,v){
var-key=k;
var值=v;
js.setProperty(对象、键、值);
});
返回对象;
}

接受答案的稍微修改版本,它还处理嵌套地图。我还添加了另一种方法:从Javascript对象到Dart映射

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);
import'package:js/js.dart';
导入“package:js/js_util.dart”;
对象映射JSObject(映射映射){
var object=newObject();
图.forEach((k,v){
if(v是Map){
setProperty(object,k,mapToJsObject(v));
}否则{
setProperty(对象,k,v);
}
});
返回对象;
}
映射jsObjectToMap(动态jsObject){
映射结果={};
列表键=_objectKeys(jsObject);
用于(动态键入键){
动态值=getProperty(jsObject,键);
列出嵌套键=对象键(值);
如果((嵌套键???[]).isNotEmpty){
//嵌套属性
结果[键]=jsObjectToMap(值);
}否则{
结果[键]=值;
}
}
返回结果;
}
列出对象键(动态jsObject){
如果(jsObject==null | | jsObject为String | | jsObject为num | | jsObject为bool)返回null;
返回_objectkey(jsObject);
}
@JS('Object.keys')
外部列表对象键(jsObject);