我正在为JS库编写一个Dart包装器,但是遇到了这个问题:
我正在使用MediaStream
(Dart)对象作为参数调用JS方法。问题是,在JS lib中,这个参数是DartObject
,并且因为它不再是MediaStream
而导致错误。
JsObject.jsify
仅适用于地图和列表,有没有办法将此对象用于JS使用?
答案 0 :(得分:3)
经过一段时间思考你的问题后,我得到了一个带有镜像API的解决方案。 可以创建一个JsObject,所以我的方法是创建一个"绑定"将在Js和dart之间建立接口的对象。感谢镜像api我能够分析对象实例以动态创建绑定。我希望它会有用
飞镖文件:
import 'dart:js';
import 'dart:mirrors';
typedef dynamic OnCall(List);
class VarargsFunction extends Function {
OnCall _onCall;
VarargsFunction(this._onCall);
call() => _onCall([]);
noSuchMethod(Invocation invocation) {
final arguments = invocation.positionalArguments;
return _onCall(arguments);
}
}
JsObject toJsObject(var inst) {
InstanceMirror im = reflect(inst);
ClassMirror classMirror = im.type;
JsObject jsObj = new JsObject(context["Object"]);
classMirror.declarations.values.where((dm) => dm is MethodMirror && dm.isRegularMethod).forEach((MethodMirror method) {
jsObj[MirrorSystem.getName(method.simpleName)] = new VarargsFunction((args) {
return im.invoke(method.simpleName, args).reflectee;
});
});
return jsObj;
}
class TestClass {
String str;
TestClass(this.str);
String getStr() {
return this.str;
}
String toString() {
return '[Myclass Instance str: "${this.str}"]';
}
JsObject toJs() {
var jsobj = new JsObject(context['Object']);
jsobj["getStr"] = this.getStr;
return jsobj;
}
}
void main() {
JsObject jsInst = context['jsInst'];
print(jsInst);
TestClass tmp = new TestClass(jsInst.callMethod("getMyAttr"));
toJsObject(tmp);
jsInst.callMethod("printDartObj", [toJsObject(tmp)]);
}
js文件:
function MyJsClass() {
this.my_attr = "Salut";
}
MyJsClass.prototype.getMyAttr = function() {
return this.my_attr;
}
MyJsClass.prototype.printDartObj = function(obj) {
console.log(obj.toString());
console.log(obj.getStr());
}
var jsInst = new MyJsClass();
console.log(jsInst);
输出:
[object Object]
[Myclass Instance str:" Salut"]
萨吕