首页 > 解决方案 > Flutter 你可以用compute()将对象作为消息“发送”吗?

问题描述

所以我基本上有一个带有update()方法的简单类。但是因为这种update()方法会进行一些数学运算,所以我想用compute()它来让它在另一个Isolate. 计划是在 中运行该update()方法Isolate并返回更新后的对象,如下所示:

compute(updateAsset, asset).then((value) => asset = value);

Asset updateAsset(Asset asset) {
  asset.update();
  return asset;
}

但后来我得到这个错误:

ArgumentError (Invalid argument(s): Illegal argument in isolate message : (object extends NativeWrapper - Library:'dart:ui' Class: Path))

是否有任何可能的方法将对象发送到一个,Isolate或者我必须将它的每个值Asset作为一个发送Integer,创建一个新对象并返回它?

标签: flutterdartdart-isolates

解决方案


根据文档

消息的内容可以是:原始值(null、num、bool、double、String)、SendPort 的实例,以及元素是这些中的任何一个的列表和映射。列表和映射也可以是循环的。

因此,我看到了您可以使用的 2 个选项。

  1. 您可以将每个值作为整数或其他原语发送,Map或者List如果您的对象可以这样解构。
  2. 如果该方法因任何原因太难,您可以将对象转换为原始类型,最简单的方法是String使用 JSON 编码。您可以使用该jsonEncode函数对您的对象进行编码,并将String其返回到您的隔离区,然后在必要时将其解码回您的对象。

推荐阅读