gpt4 book ai didi

javascript - DartObject 在传递到 JsObject.callMethod 时未展开

转载 作者:搜寻专家 更新时间:2023-11-01 04:25:13 25 4
gpt4 key购买 nike

我正在为 JS 库编写 Dart 包装器,但遇到了这个问题:

我正在使用 MediaStream (Dart)Object 作为参数调用 JS 方法。问题是,在 JS 库中,这个参数是一个 DartObject,并且会导致错误,因为它不再是一个 MediaStream

JsObject.jsify 仅适用于 Maps 和 Lists,有没有办法将此对象 jsify 以供 JS 使用?

最佳答案

经过一段时间思考您的问题后,我得到了一个使用镜像 API 的解决方案。可以创建一个 JsObject,所以我的方法是创建一个“绑定(bind)”对象,它将成为 Js 和 Dart 之间的接口(interface)。感谢镜像 api,我能够分析对象实例以动态创建绑定(bind)。我希望它会有用

Dart 文件:

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"]

Salut

关于javascript - DartObject 在传递到 JsObject.callMethod 时未展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com