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

时间:2014-06-08 01:09:42

标签: javascript dart

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

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

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

1 个答案:

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

     

萨吕