4

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

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

static int count(BuildContext context) {
  // Something very slow.
  return 10;
}

尝试传递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':.))

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

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

4

1 回答 1

2

文档中所述,不 - 您不能将 a 发送BuildContext到一个compute函数,即另一个函数Isolatecompute只是简单隔离的包装器)。

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

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

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


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

于 2019-11-10T20:08:31.960 回答