3

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

问题

此示例在 Dartium 中运行良好,但是当编译为 javascript 时会发生类型错误:Uncaught TypeError: undefined is not a function对于以下行:

context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);

我已经走了多远

  • 正如您在示例中看到的那样,函数alert()console.log()viadart:js也在 js-extension 中工作。所以这可能是 dart2js 和添加事件监听器的一个特殊问题?
  • 打印出来也context['chrome']['runtime']['onMessage']显示了正确的事件对象。(例如context['console'].callMethod('log', [context['chrome']['runtime']['onMessage']]);:)
  • 我知道存在一个 chrome pub 包,但是在响应 onMessage 中收到的消息时仍然存在错误。另请参阅此问题。直接通过 dart:js 使用 chrome api 是该 dart 版本的解决方法。

我玩了很多代码,但都导致相同的错误。现在我没有想法了。希望社区能再次帮助我。

编辑: 我现在按照罗伯特的建议在dartbug.com上报告了这个错误。无论如何,如果有人知道,我仍然愿意寻求解决方法或其他方法。

4

2 回答 2

3

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

//Placed in web/

import 'dart:js';

void main() {
  //This doesnt work in js
  context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);
  context['chrome']['runtime'].callMethod('sendMessage', ['someMessage']);
  context['chrome']['runtime'].callMethod('sendMessage', [null, 'someMessage']);
}


void onMessageListener(message, sender, sendResponse) {
  print("test");
  print(message);
}

输出

test (:1)
someMessage (:1)
test (:1)
someMessage (:1)

问候,罗伯特

// 抱歉错过了你得到的异常

您应该在 www.dartbug.com 上提交有关此问题的错误

问候,罗伯特

// 现在你应该可以使用 chrome 包了。它在这里工作正常:

import 'dart:js';
import 'package:chrome/chrome_ext.dart' as chrome;

void onMessageListener(message, sender, sendResponse) {
  print("test");
  print(message);
}

void main() {
  chrome.runtime.onMessage.listen((chrome.OnMessageEvent event) {
    print(event.message);
  });

  JsObject runtime = context['chrome']['runtime'];
  runtime.callMethod('sendMessage', ['someMessage']);
  runtime.callMethod('sendMessage', [null, 'someMessage']);
}

问候,罗伯特

于 2014-09-03T09:31:24.397 回答
0

正如keerti已经提到的:可以在此处找到解决方法的类似问题。

我的解决方案如下所示:

  //Tmp: sendResponse is buged, so we use the js-version
  //chrome.runtime.onMessage.listen(onMessageDartListener);

  //..and ofcourse the js-version is buged too. So this workaround here:
  var jsOnMessageEvent = context['chrome']['runtime']['onMessage'];
  JsObject dartOnMessageEvent = (jsOnMessageEvent is JsObject ? jsOnMessageEvent : new JsObject.fromBrowserObject(jsOnMessageEvent));
  dartOnMessageEvent.callMethod('addListener', [onMessageListener]);
于 2014-09-04T18:27:32.967 回答