首页 > 解决方案 > 在隔离计算功能中运行 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)

标签: flutterdartparse-platformdart-isolates

解决方案


从 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();
    
  });
}

推荐阅读