Flutter: можете ли вы отправлять объекты в виде сообщения с помощью calculate()?

Итак, у меня есть простой класс с методом 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, создать новый объект и вернуть его?


person evilevidenz    schedule 28.07.2020    source источник


Ответы (1)


Согласно документам:

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

Итак, я вижу 2 варианта, которые вы можете использовать.

  1. Вы можете отправить каждое значение как целое число или другой примитив в Map или List, если ваш объект может быть деконструирован таким образом.
  2. Если этот метод слишком сложен по какой-либо причине, вы можете вместо этого преобразовать свой объект в примитивный тип, самым простым из которых является String с кодировкой JSON. Вы можете закодировать свой объект с помощью функции jsonEncode и отправить String, который он возвращает, в ваш изолят, где вы затем, при необходимости, декодируете его обратно в свой объект.
person Christopher Moore    schedule 28.07.2020
comment
Большое спасибо. Другой вопрос. С точки зрения времени выполнения, было бы более эффективно вызывать calculate() со списком элементов или вызывать calculate() для каждого элемента в этом списке. А также не сильно ли задерживает кодирование и декодирование процесс? update() вызывается примерно каждый кадр, так что да, большое спасибо. - person evilevidenz; 28.07.2020
comment
@evilevidenz Вызов compute со списком элементов, вероятно, более эффективен. Кодирование и декодирование, безусловно, добавляют некоторые накладные расходы. Таким образом, ручное сопоставление вашего объекта с примитивными значениями было бы более эффективным, но может оказаться нецелесообразным для вашего приложения. - person Christopher Moore; 28.07.2020