我有一个Dart js-interop回调,它反过来将javascript回调作为参数。 dart回调实现如下所示:
void callBackToDartCode(String query, js.FunctionProxy completionCallback) {
js.context.completionCallback = completionCallback;
doSomethingAscyn(query).then(
(result) {
// hand the query result back to the javascript code
js.context.completionCallback(js.map(result));
});
这很有效。使这项工作的关键是将FunctionProxy保存在js.context中,以便在async"然后"执行它时可以使用它。方法。这行代码非常重要:
js.context.completionCallback = completionCallback;
如果没有这样做,则不保留completeCallback,因此在异步操作完成时无法调用。
我没有看到这样的例子,我不确定我是否真的这样做过。
提出了问题:
答案 0 :(得分:1)
使用 js-interop 所有代理都是作用域的,以防止内存泄漏。这意味着Proxy
将在其关联范围的末尾丢失其JS对象引用。如果scoped((){})
函数未明确使用,则在第一次完成互操作时初始化延迟作用域,并且在当前事件循环结束时自动关闭作用域。如果您想让Proxy
的寿命超过相关范围,则必须保留它。这可以使用js.retain(proxy)
完成。不再需要您的代理后,您可以使用js.release(proxy)
。
因此你的代码应该是:
void callBackToDartCode(String query, js.FunctionProxy completionCallback) {
js.retain(completionCallback);
doSomethingAscyn(query).then(
(result) {
// hand the query result back to the javascript code
completionCallback(js.map(result));
// completionCallback is no longer used
js.release(completionCallback);
});
}
关于从js.context取消关联“completeCallback”的问题您可以使用js.deleteProperty(js.context, "completeCallback")