Могу ли я передать BuildContext для вычисления? - PullRequest
1 голос
/ 10 ноября 2019

Можно ли использовать BuildContext внутри функции compute ?

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':.))

Если я изменю ввод для функции подсчета на другой нормальный класс, он будет работать нормально.

Есть ли способ исправить это? Или возможно использование BuildContext в Isolate ? Спасибо!

1 Ответ

1 голос
/ 10 ноября 2019

Как объяснено в документации , нет - вы не можете отправить BuildContext в compute функцию, т. Е. Другую Isolate (compute - это просто оболочка для простых изолятов).

Существуют ограничения на значения, которые можно отправлять и получать в изоляты и из них. Эти ограничения ограничивают возможные значения Q и R. См. Обсуждение по адресу SendPort.send .

message - это значение Q (R - возвращаемое значение), и поэтому подлежит следующемуограничения:

Содержимое message может быть: примитивные значения (null, num, bool, double, String), экземпляры SendPort , а также списки и карты, элементы которыхЛюбой из них. Список и карты также могут быть циклическими.


Если вы хотите узнать больше об изолятах в целом, команда Flutter опубликовала видео о работе с Isolate s вДетонация . Они также объясняют, как изоляты работают на более низком уровне, что может быть полезно для понимания, почему существуют эти ограничения.

...