传递给JsObject.callMethod时,DartObject未解包

Ska*_*Rat 5 javascript dart

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

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

JsObject.jsify 仅适用于地图和列表,有没有办法jsify这个对象的JS使用?

Vin*_*ink 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)]);
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

输出 :

[对象对象]

[Myclass实例str:“致敬”]

致敬