Isolate compute函数中运行Parse LiveQuery报错该如何解决?
问题根因
Dart 的 Isolate 是完全独立的执行上下文,内存空间不共享,你在主 Isolate 做的 Parse SDK 初始化,子 Isolate 完全感知不到。你在子 Isolate 里直接创建LiveQuery实例的时候,SDK 内部依赖的全局单例ParseCoreData还未初始化,就抛出了对应报错。
修复方案
你只需要在子 Isolate 的入口函数最开始,重新做一次 Parse SDK 的初始化即可,和主 Isolate 的初始化参数保持一致就行。修改后的子 Isolate 代码如下:
Future<void> isolateLiveQuery(String color) async { // 新增:子 Isolate 内先初始化 Parse SDK await Parse().initialize( keyApplicationId, keyParseServerUrl, clientKey: keyClientKey, liveQueryUrl: liveQueryURL, connectivityProvider: CustomParseConnectivityProvider(), autoSendSessionId: true, debug: false, ); final LiveQuery liveQuery = LiveQuery(); QueryBuilder<ParseObject> query = QueryBuilder<ParseObject>(ParseObject('Color')); Subscription subscription = await liveQuery.client.subscribe(query); List<String> colors = []; subscription.on(LiveQueryEvent.create, (value) { print('Added: ' + value['color']); colors.add(((value as ParseObject).get('color'))); print(colors.toString()); sleep(Duration(seconds: 2)); value.delete(); }); }
注意事项
- 如果你的初始化参数是主 Isolate 动态生成的,可以把参数打包成自定义对象,通过
Isolate.spawn的传参带入子 Isolate 使用 - 子 Isolate 和主 Isolate 的 Parse SDK 实例完全独立,两边的 Session、缓存数据默认不共享,如果需要同步状态可以通过 SendPort/ReceivePort 通信实现
- 不要在事件回调里用
sleep阻塞线程,会导致 LiveQuery 的心跳包和事件接收延迟,你可以把sleep换成Future.delayed异步执行
内容的提问来源于stack exchange,提问作者RobbB
相关产品推荐
相关产品推荐

