#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
использование в основном изоляте.