Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome extension Dart chrome扩展:如何在onMessage中发送响应?_Google Chrome Extension_Dart - Fatal编程技术网

Google chrome extension Dart chrome扩展:如何在onMessage中发送响应?

Google chrome extension Dart chrome扩展:如何在onMessage中发送响应?,google-chrome-extension,dart,Google Chrome Extension,Dart,现在我正在用谷歌的Dart开发一个Chrome扩展。 除了onMessage处理之外,所有操作都正常 使用的镀铬包装:~ 在我调用的后台脚本中: import'包装:chrome/chrome\u ext.dart'作为chrome; void main(){ //... //Binde事件侦听器 chrome.runtime.onMessage.listen(onMessage); //... } /** *消息事件处理 */ bool-onMessage(chrome.OnMessageEv

现在我正在用谷歌的Dart开发一个Chrome扩展。 除了onMessage处理之外,所有操作都正常

使用的镀铬包装:~

在我调用的后台脚本中:

import'包装:chrome/chrome\u ext.dart'作为chrome;
void main(){
//...
//Binde事件侦听器
chrome.runtime.onMessage.listen(onMessage);
//...
}
/**
*消息事件处理
*/
bool-onMessage(chrome.OnMessageEvent-messageEvent){
JsObject message=messageEvent.message;
JsFunction response=messageEvent.sendResponse;
开关(消息['action']){
//...
//用于弹出窗口
案例“刷新”:
打印('调用刷新!');
chrome.storage.sync.get(){
新的JsObject(响应,[newJSObject.jsify({'done':true}]);
});
//Idicate异步发送响应(在OnMessageEvent参考文件中有这样的说法。)
返回true;
//...
}
返回false;
}
我的弹出脚本如下所示:

/。。。
chrome.runtime.sendMessage({
“操作”:“刷新”
}).然后(){
打印(“接收响应!”);
});
//...
什么在起作用: “刷新”消息从弹出脚本发送到后台脚本有效! 后台脚本打印
刷新调用

什么不起作用: 弹出脚本从不接收从后台脚本调用的响应:
newjsobject(响应,[newjsobject.jsify({'done':true}))

我不知道如何处理sendResponse来真正发送响应。也许我对JsObject的调用是错误的?希望其他人能帮忙。 (顺便说一句,非异步响应在这里也不起作用)



此问题也在上打开。

您的问题可能在于如何尝试发回响应:

newjsobject(响应,[newjsobject.jsify({'done':true}));
根据文档,在您的情况下,该功能应按如下方式调用:

response.apply([newjsobject.jsify({'done':true}]);

更新:这里是工作代码: 背景.省道

导入'dart:js';
void main(){
打印(“main()…”;
上下文['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]);
}
消息侦听器无效(请求、发送方、发送响应){
打印(“收到的操作=${request['action']}”);
apply([new JsObject.jsify({'done':true})];
}
飞镖

导入'dart:js';
void main(){
打印(“main():…”;
context['chrome']['runtime'].callMethod('sendMessage',[new JsObject.jsify({'action':'refresh'}),(response)=>print(“received${response['done']}”);
}

更新:使其也能在JavaScript中工作所需的补丁 如注释中所述,从
上下文['chrome']['runtime']['onMessage']
返回的对象存在问题。。。如果它不是
JsObject
,则应使用
new JsObject.fromBrowserObject()

var jsObject=context['chrome']['runtime']['onMessage'];
(jsObject是jsObject?jsObject:新建jsObject.fromBrowserObject(jsObject))
.callMethod('addListener',[onMessageListener]);

希望有帮助;-)

正如zoechi已经提到的:“我尝试了response.apply([new JsObject.jsify({'done':true})];这不会导致异常,但提供的JavaScript回调也不会被调用。”我用工作的dart代码更新了答案。我使用的是直接的dart:js,而dart:chrome包也适合我!谢谢。顺便说一句,在eventListener中返回true时,异步响应也可以工作。现在可以工作了吗?我在调用addListener时出错。“context['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]);”未捕获类型错误:J.p(…).a0不是函数“我的环境”-版本47.0.2526.73(64位)-Dart虚拟机版本:1.13.0(2015年11月18日星期三12:15:29)在“macos_x64”上调用addListener而不使用dart2js minify时出错。这一行:“上下文['chrome']['runtime']['onMessage'].callMethod('addListener',[onMessageListener]);”错误:“未捕获类型错误:J.$index$asx(…)。callMethod$2不是函数”