flutter - 在隔离计算功能中运行 Parse LiveQuery 时遇到问题
问题描述
只需将我的实时查询移至隔离区,它就不再起作用了。我希望我的隔离等待与其他一些简单任务并发的实时查询对象。我在调试控制台中收到一条非常模糊的错误消息,我没有太多可做的。真的不知道是什么原因造成的。
有没有人有我可以深入研究的任何想法或起点?这段代码在重构为隔离之前工作正常......我做错了什么还是无法在隔离中运行实时查询?
编辑:我刚刚创建了一个简单的 dart-only 演示项目,并在初始化 LiveQuery() 的同一位置得到完全相同的错误。我已经用这个演示项目交换了代码,因为它更简单,更容易重现。
主要隔离
Future<void> main(List<String> arguments) async {
...
await Parse().initialize(
keyApplicationId,
keyParseServerUrl,
clientKey: keyClientKey,
liveQueryUrl: liveQueryURL,
connectivityProvider: CustomParseConnectivityProvider(),
autoSendSessionId: true,
debug: false,
);
await incomingCreate();
await Isolate.spawn(isolateLiveQuery, 'red');
}
class CustomParseConnectivityProvider extends ParseConnectivityProvider {
@override
Future<ParseConnectivityResult> checkConnectivity() async => ParseConnectivityResult.wifi;
@override
Stream<ParseConnectivityResult> get connectivityStream => Stream<ParseConnectivityResult>.empty();
}
隔离
Future<void> isolateLiveQuery(String color) async {
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();
});
}
错误控制台
Unhandled exception:
LateInitializationError: Field '_instance@19240915' has not been initialized.
#0 ParseCoreData._instance (package:parse_server_sdk/src/data/parse_core_data.dart)
package:parse_server_sdk/…/data/parse_core_data.dart:1
#1 new ParseCoreData
package:parse_server_sdk/…/data/parse_core_data.dart:5
#2 isDebugEnabled
package:parse_server_sdk/…/utils/parse_utils.dart:8
#3 new LiveQuery
package:parse_server_sdk/…/network/parse_live_query.dart:432
#4 isolateLiveQuery
package:service_realtime_database/service_realtime_database.dart:25
#5 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:286:17)
#6 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
解决方案
从 Back4App 获得了一些帮助 - 一如既往的出色客户服务。他们向我提出了答案,当然,它奏效了。
感觉很愚蠢,我没有意识到出了什么问题,但嘿,这是学习的一部分……我会留下这个,不会删除它,以防其他人遇到同样的问题;p
无论如何,答案是在隔离内初始化 Parse。看到隔离无法访问 Parse.initialize() 它必须重新初始化才能进行网络操作。
简单修复:
Future<void> isolateLiveQuery(String color) async {
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();
});
}
推荐阅读
- dita - 在 Oxygen XML 编辑器中,我可以自动将文件夹复制到转换的输出文件夹吗?
- android - 模拟器未授权
- python - 遍历 pandas 数据框并一次选择 n 行和列
- mysql - 修剪 0 和尾随/前导空格不会给出结果 - MySQL
- function - makefile 中的局部变量未正确展开
- git - 同步对话框中缺少的选项卡在哪里?
- ajax - 将ajax调用的结果插入页面代码时的范围问题
- jquery - 以一种糟糕的方式在 Vue 中导入 jQuery bootstrap-table 插件
- twitter-bootstrap - 怎么放在bootstrap 4 form-inline中标记到一个额外的div?
- javascript - 使用 JavaScript 创建无限逆时针旋转木马的难度