Google chrome extension Dart chrome扩展:侦听chrome api事件

Google chrome extension Dart chrome扩展:侦听chrome api事件,google-chrome-extension,dart,dart2js,dart-js-interop,Google Chrome Extension,Dart,Dart2js,Dart Js Interop,为了更好地描述我的问题,我创建了一个用Dart编写的chrome扩展的小示例。 您可以在上查看代码或下载扩展 问题 此示例在Dartium中运行良好,但在编译为javascript时,会出现类型错误:uncaughttypeerror:undefined不是该行的函数: context['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]); 我已经走了多远 正如您在示例中看到的,函数al

为了更好地描述我的问题,我创建了一个用Dart编写的chrome扩展的小示例。 您可以在上查看代码或下载扩展

问题

此示例在Dartium中运行良好,但在编译为javascript时,会出现类型错误:
uncaughttypeerror:undefined不是该行的函数

context['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]);
我已经走了多远

  • 正如您在示例中看到的,函数
    alert()
    console.log()
    via
    dart:js
    也在js扩展中工作。所以dart2js和添加EventListener可能会有特殊问题
  • 同时打印出
    context['chrome']['runtime']['onMessage']
    会显示正确的事件对象。(例如:
    context['console'].callMethod('log',[context['chrome']['runtime']['onMessage']]);
  • 我知道存在一个chrome pub包,但在响应onMessage中收到的消息时仍然存在一个bug。另见此。通过dart:js直接使用chromeapi是解决方法,在该dart版本中很好

我对代码做了很多修改,但都导致了相同的错误。现在我没有主意了。希望社区能再次帮助我

编辑: 我现在已经按照Robert的建议报告了这个bug。
无论如何,如果有人知道的话,我仍然愿意找一个解决办法或其他什么。

所以你的例子对我来说很好:

//放置在web中/
导入“dart:js”;
void main(){
//这在js中不起作用
上下文['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]);
上下文['chrome']['runtime'].callMethod('sendMessage',['someMessage']);
上下文['chrome']['runtime'].callMethod('sendMessage',[null,'someMessage']);
}
无效的消息侦听器(消息、发件人、sendResponse){
打印(“测试”);
打印(信息);
}
输出

测试(:1)
someMessage(:1)
测试(:1)
someMessage(:1)
问候,, 罗伯特

//很抱歉,您错过了例外情况

你应该在www.dartbug.com上提交一个关于这个的bug

问候,, 罗伯特

//现在你应该可以使用chrome软件包了。它在这里工作得很好:

导入'dart:js';
将“包装:chrome/chrome_ext.dart”作为chrome导入;
无效的消息侦听器(消息、发件人、sendResponse){
打印(“测试”);
打印(信息);
}
void main(){
listen((chrome.OnMessageEvent事件){
打印(事件消息);
});
JsObject runtime=context['chrome']['runtime'];
callMethod('sendMessage',['someMessage']);
callMethod('sendMessage',[null,'someMessage']);
}
问候,,
Robert

正如keerti已经提到的那样:可以找到类似的解决方法问题

我的解决方案如下所示:

//Tmp:sendResponse安装了错误,所以我们使用js版本
//chrome.runtime.onMessage.listen(onMessageDartListener);
//..当然js版本也安装了窃听器。所以这里的解决方法是:
var jsOnMessageEvent=context['chrome']['runtime']['onMessage'];
JsObject dartOnMessageEvent=(jsOnMessageEvent是JsObject?jsOnMessageEvent:新的JsObject.fromBrowserObject(jsOnMessageEvent));
callMethod('addListener',[onMessageListener]);

您是否已将示例编译为Js?dart版本也适用于我,但编译的Js-version不适用。不,这是我的错误。正在调试。给我一秒钟:)因此错误来自addListener访问。但是我现在不能告诉你为什么。没错。我的结果是相似的。如上所述:可以访问chrome.runtime.onMessage<代码>上下文['console'].callMethod('log',[context['chrome']['runtime']['onMessage']])打印事件对象。但是在对象上调用addListiner会破坏扩展名:(对您的编辑来说)“现在您应该可以使用chrome软件包了”:如问题中所述,我使用了
chrome.runtime.onMessage.listen
,但该软件包在响应功能中有一个我也想使用的错误。这是我切换到js interop变体的主要原因。遗憾的是,使用dart:js而不是chrome(-package)也给我指出了这个错误。(关于chrome软件包的错误,请参阅很久以前发布的)Andi,看看。它对我很有效。是的!非常感谢。我已经知道该线程,但没有意识到它是关于同一个问题。被这个错误困扰了一个月…谢谢人:)