Dart Chrome扩展程序:如何在onMessage中发送响应?

和我

现在,我正在使用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打电话是错的?希望其他人能帮忙。(顺便说一句,非异步响应在这里也不起作用)


这个问题也在github.com/dart-gde/chrome.dart打开

德拉斯科·科基奇(DraškoKokić)

您的问题可能在于您尝试发送回响应的方式:

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']}")]);
}

更新:必需的补丁程序也可以使其在JavaScript中工作

如注释中所述,从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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Dart Chrome扩展程序:如何在onMessage中发送响应?

来自分类Dev

如何在 dart post 请求中发送数组

来自分类Dev

将Dart用于Chrome扩展程序

来自分类Dev

如何在Dart中扩展Rectangle类?

来自分类Dev

如何在Dart中扩展功能?

来自分类Dev

Dart Chrome扩展程序:收听Chrome API事件

来自分类Dev

Dart chrome扩展程序:监听chrome API事件

来自分类Dev

在Dart中扩展dart:html类“ ButtonElement”

来自分类Dev

在Dart中扩展dart:html类“ ButtonElement”

来自分类Dev

在Dart中发送SMTP电子邮件

来自分类Dev

如何从Dart扩展Google地图

来自分类Dev

如何使用Dart扩展功能?

来自分类Dev

Dart HTTPClient响应查询

来自分类Dev

Dart隔离呼叫或发送

来自分类Dev

Dart如何模拟程序

来自分类Dev

如何解析Dart程序?

来自分类Dev

如何区分Dart类型

来自分类Dev

如何删除Dart DevTools?

来自分类Dev

Dart:如何迭代整数?

来自分类Dev

如何设置Dart路径?

来自分类Dev

如何在Dart中访问HttpRequest的响应结果?

来自分类Dev

如何在Polymer Dart中以编程方式添加扩展的LIElement?

来自分类Dev

如何在Dart中使用扩展名

来自分类Dev

如何在Dart中创建静态扩展方法?

来自分类Dev

Dart:如何在本机扩展中创建流

来自分类Dev

如何在Dart中通过HttpServer发送图像文件?

来自分类Dev

用Dart模拟HTTP响应

来自分类Dev

用Dart模拟HTTP响应

来自分类Dev

Dart:mixin组成,无需扩展