现在,我正在使用Google的Dart开发Chrome扩展程序。除了onMessage-handling之外,其他所有方法都工作正常。
使用的Chrome-Package:API参考。〜OnMessageEvent参考。
在背景脚本中,我正在调用:
import 'package:chrome/chrome_ext.dart' as chrome;
void main() {
//...
//Binde event-listeners
chrome.runtime.onMessage.listen(onMessage);
//...
}
/**
* Message event handling
*/
bool onMessage(chrome.OnMessageEvent messageEvent){
JsObject message = messageEvent.message;
JsFunction response = messageEvent.sendResponse;
switch(message['action']){
//...
//Used by popup
case 'refresh':
print('Refresh called!');
chrome.storage.sync.get().then((_){
new JsObject(response, [new JsObject.jsify({'done': true})]);
});
//Idicate to send a response asynchronously (So it's said in the OnMessageEvent Ref.)
return true;
//...
}
return false;
}
我的弹出脚本如下所示:
//...
chrome.runtime.sendMessage({
'action': "refresh"
}).then((_){
print('receiving response!');
});
//...
什么是工作:消息“刷新”,从弹出脚本到后台脚本作品送!背景脚本打印Refresh called!
什么不起作用:弹出脚本永远不会收到从后台脚本调用的响应:new JsObject(response, [new JsObject.jsify({'done': true})]);
。
我不知道如何让sendResponse真正发送响应。也许我用JsObject打电话是错的?希望其他人能帮忙。(顺便说一句,非异步响应在这里也不起作用)
您的问题可能在于您尝试发送回响应的方式:
new JsObject(response, [new JsObject.jsify({'done': true})]);
根据dart.js文档,在您的情况下,应按以下方式调用该函数:
response.apply([new JsObject.jsify({'done': true})]);
background.dart
import 'dart:js';
void main() {
print("main()...");
context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);
}
void onMessageListener(request, sender, sendResponse) {
print("received action = ${request['action']}");
sendResponse.apply([new JsObject.jsify({'done': true})]);
}
popup.dart
import 'dart:js';
void main() {
print("main():...");
context['chrome']['runtime'].callMethod('sendMessage', [new JsObject.jsify({'action': 'refresh'}), (response) => print("received ${response['done']}")]);
}
如注释中所述,从context['chrome']['runtime']['onMessage']
...返回的对象存在问题,如果不是JsObject
,则应使用来将其包装new JsObject.fromBrowserObject()
var jsObject = context['chrome']['runtime']['onMessage'];
(jsObject is JsObject ? jsObject : new JsObject.fromBrowserObject(jsObject))
.callMethod('addListener', [onMessageListener]);
希望能帮助到你 ;-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句