【问题标题】:Dart Language: how to convert a String into a Transferable (ByteBuffer)Dart 语言:如何将 String 转换为 Transferable (ByteBuffer)
【发布时间】:2014-11-22 13:44:17
【问题描述】:

我将使用 window.postMessage("", "*", [transferableData]) 在两个浏览器窗口之间发送数据。但是,我没有找到任何关于如何将类型转换为 Transferables 的直接答案。

所以,为了让我开始学习这一点,我很高兴知道如何将简单的字符串转换为可传输的(ByteBuffer)并在另一端读取它(在正在获取带有数据的消息)。这将帮助我解决我的问题并了解这个概念。

重要更新:

这个问题把我引到这里:Dart Language: printing reports

可传输对象尚未在 Dart VM 上实现 (http://dartbug.com/4149)。这意味着,如果您通过 Dartium (Dart VM) 运行应用程序,则另一个窗口将接收和处理 postMessage 的第一个参数,而不是 Transferable Object。然而,JavaScript 完成了这项工作:对象被传输,原始数组被清空。

【问题讨论】:

  • window.postMessage() 应该接受字符串,不是吗?
  • @罗伯特,对不起。我忘了说我会使用 postMessage 来发送 Transferable data => window.postMessage("", "*", [transferableData])。
  • 您提到,postMessage 会截断消息。不过,我还没有找到关于 postMessage 的最大消息长度的任何信息。

标签: dart converter dart-html transferable


【解决方案1】:
import 'dart:convert';

var list = Utf8.encode('xxx');
var data = list is Uint8List ? list.buffer : new Uint8List.fromList(list).buffer;

使用window.PostMessage发送数据

window.postMessage({'data': data}, '*', [data]);

然后在接收端读取它,就像

var string = Utf8.decode(message.data['data']);

另请参阅http://dartbug.com/19968 了解可转让的状态。
据我所知,最近的 Dart 开发频道版本已经随 Dartium 38.xxx 一起发布。
这是一个可转让的小测试用例https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/tests/html/transferables_test.dart

【讨论】:

  • codeUnits getter 返回一个 16 位整数列表。从这些创建Uint8List 将丢弃较高位,因此此解决方案仅适用于 Latin-1 字符串。要么使用Uint16List,要么先进行UTF-8编码。
  • Guenter 我根据 lrn 的评论更新了评论 - 随意调整它。注意 Utf8.encode() 当前实现的总是返回一个 Uint8List。但最好还是谨慎行事并检查类型。
  • @GregLowe 这不仅仅是修正错别字。我认为在这种情况下,最好添加另一个答案而不是编辑现有答案。实际上,当一个问题有多个答案时,我发现这是一件好事。还是谢谢。
  • 作为用户,我发现最好阅读更少但正确的 cmets,而不是检查多个答案和每个评论线程是否有错误。我认为最好作为一个团队一起工作以创建最新的正确 cmets - 但我尊重您的意见分歧,并且不会再对您的答案这样做。另外 - 我在这里检查了stackoverflow.com/help/editing,我认为我的编辑被描述为:“纠正小错误”。
  • @GünterZöchbauer,我已经对其进行了测试,这正是他们所说的:它还不能在 Dart VM 上工作,但在 JavaScript 构建上它工作正常(数组被清空)。我将使用此信息更新问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多