【问题标题】:Can I pass a BuildContext to Compute?我可以将 BuildContext 传递给 Compute 吗?
【发布时间】:2019-11-10 19:50:07
【问题描述】:

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

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

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

尝试将context 传递给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? 谢谢!

【问题讨论】:

  • 问题是:你为什么要这么做?
  • 我的代码使用 BuildContext 计算了一些复杂的东西。
  • 所以你必须改变它,使它不使用BuildContext

标签: flutter dart dart-isolates


【解决方案1】:

作为explained in the documentation,不 - 您不能将BuildContext 发送到compute 函数,即另一个Isolatecompute 只是简单隔离的包装器)。

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

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

message 的内容可以是:原始值(null、num、bool、double、String),SendPort 的实例,以及元素为这些元素的列表和映射。列表和地图也可以是循环的。


如果您想了解更多关于隔离区的一般信息,Flutter 团队发布了video about working with Isolates in Flutter。它们还解释了隔离物如何在较低级别上工作,这可能有助于您了解这些限制存在的原因。

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 2013-10-08
    • 1970-01-01
    • 2011-07-17
    • 2017-10-09
    • 1970-01-01
    • 2019-07-28
    • 2013-01-05
    • 2023-03-09
    相关资源
    最近更新 更多