我可以将 BuildContext 传递给 Compute 吗?

use*_*654 7 dart dart-isolates flutter

是否可以在计算函数中使用 BuildContext ?

Future<int> getFuture() async {
  int r = await compute(count, context);
  return r;
}

static int count(BuildContext context) {
  // Something very slow.
  return 10;
}
Run Code Online (Sandbox Code Playgroud)

尝试传递contextto时收到以下错误compute

I/flutter ( 8764): AsyncSnapshot<int>(ConnectionState.done, null, Invalid argument(s): Illegal argument in isolate message : (object is a closure - Function '_handleBuildScheduled@374399801':.))
Run Code Online (Sandbox Code Playgroud)

如果我将 count 函数的输入更改为其他普通类,它就可以正常工作。

有没有什么办法解决这一问题?或者可以在Isolate中使用 BuildContext 吗?谢谢!

cre*_*not 4

正如文档中所解释的,不 - 您不能将 a 发送BuildContextcompute函数,即另一个函数Isolatecompute只是简单隔离的包装器)。

可以向隔离区发送和从隔离区接收的值存在限制。这些限制限制了 Q 和 R 的可能值。请参阅SendPort.send中的讨论。

是(是返回值)message的值,因此受到以下限制:QR

的内容message可以是:原始值(null、num、bool、double、String)、SendPort的实例以及其元素为其中任何一个的列表和映射。列表和映射也允许是循环的。


如果您想了解有关隔离的更多信息,Flutter 团队发布了有关在 Flutter 中使用 s 的视频Isolate。他们还解释了隔离如何在较低级别上工作,这可能有助于您理解为什么存在这些限制。