Вызов асинхронной функции верхнего уровня из другого изолята

#flutter #dart #flutter-dependencies

#трепетать #dart #зависящие от flutter #flutter

Вопрос:

Невозможно вызвать асинхронную функцию верхнего уровня из другого изолята, примером может быть попытка получить доступ к SharedPreferences / значению Document-path из другого изолята, поскольку для получения экземпляра потребуется «ожидание».

В моем случае я использую flutter_downloader, загружается в другом изоляте, как только загрузка завершается, вызывается метод шифрования, который сохраняет результат в пути к документу, path_provider getApplicationDocumentsDirectory() возвращает future, который требует ожидания. Я сделал функцию шифрования асинхронной, и она никогда не вызывается с использованием обоих compute и Isolate.spawn , так что она вычисляет шифрование в другом изоляте.

Ответ №1:

Проблема, вероятно, в том, что в изолятах нет доступных плагинов, поэтому path_provider и shared_preferences не работают при вызове из изолята.

Если вам нужен getApplicationDocumentsDirectory() , то вы можете определить этот путь перед запуском изоляции и передать его в изолят в виде сообщения. Таким образом, у вас есть путь, доступный в изоляте, и вы можете сохранить файл там. Доступ к shared_prefs на самом деле невозможен, вы можете сделать это только после завершения изоляции.

Есть несколько проектов, таких какhttps://pub.dev/packages/flutter_isolate которые пытаются сделать плагины доступными в изолятах. Вы можете изучить их и посмотреть, соответствует ли это вашим потребностям.

Специально для flutter_downloader в README есть пример, показывающий, как взаимодействовать между фоновым изолятом, который обрабатывает обратный вызов загрузки, и основным изолятом вашего приложения. По сути, вам нужно передать сообщение главному изоляту типа PleaseGiveMeTheApplicationDocumentsDirectory , а затем ответить на сообщение с помощью HereYourGoThisIsTheApplicationDocumentsDirectory .

Вы можете использовать, IsolateNameServer.lookupPortByName чтобы получить SendPort из основного изолята и передать ему SendPort из фонового изолята, а затем ответить правильным путем. Как только обе стороны узнают, куда отправлять сообщения, вы можете передавать все, что хотите, вы также можете передать сообщение, которое запускает некоторое shared_preferences использование в основном изоляте.