【问题标题】:Calling top-level async function from different Isolate从不同的 Isolate 调用顶级异步函数
【发布时间】:2021-03-16 17:44:16
【问题描述】:
无法从另一个隔离区调用顶级异步函数,例如尝试从不同隔离区访问 SharedPreferences/Document-path 值,因为获取实例需要“等待”。
在我的例子中,我使用flutter_downloader,在另一个隔离中下载,一旦下载完成,就会调用一种加密方法,将结果保存在文档路径中,path_provider'sgetApplicationDocumentsDirectory() 返回一个需要的未来等待。我已将加密函数设为异步,并且永远不会同时使用 compute 和 Isolate.spawn 调用它,以便它计算另一个隔离中的加密。
【问题讨论】:
标签:
flutter
dart
flutter-dependencies
【解决方案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 使用。