subscription.on('open') 在flutter parse-platform 中等效 免责声明

问题描述

我正在尝试通过颤振中的流加载对象。目前,我无法找到如何实现这一点的方法,而无需在听之前调用一个 get 函数

在构造 StreamSubscription 之前,我首先调用 getAllObject() 函数。这是因为目前在我的代码中,我的流 listenToUpdates() 依赖于 List<Objects> 返回的 getAllObject()

有什么方法可以仅使用流来实现这一点。或者你能给我一些关于如何解决这种情况的想法吗?提前致谢

编辑

这是我在加载视图时调用函数

Future listenToUserAddresses() async {
    setBusy(true);

    var resultingData = await _parseService.getMyAddresses(currentCustomerObject,currentUser.userId);
    _userAddresses = resultingData[0] is bool ? _userAddresses = [] : resultingData[0];
    notifyListeners();
    setBusy(false);
    
    subscription = _parseService
    .listenToUserAddressesRealTime(resultingData[1],_userAddresses)
    .listen((userAddressesData) {
      List<UserAddress> updatedUserAddresses = userAddressesData;
      if (updatedUserAddresses != null) {
        print('NOT NULL');
        _userAddresses = updatedUserAddresses;
        setBusy(false);
        notifyListeners();
      } else {
        print('NULL');
        _userAddresses.clear();
        setBusy(false);
        notifyListeners();
      }
    });
  }

现在,这是用于 getMyAddresses 方法的。此函数接受 ParSEObjectCustomer Class 和当前用户 ID,它将返回一个由对象列表和订阅组成的数组。

Future getMyAddresses(ParSEObject customerObject,String currentUserId) async {
    List result = [];
    final LiveQuery liveQuery = LiveQuery();
    QueryBuilder<ParSEObject> query = QueryBuilder<ParSEObject>(ParSEObject(_addressesCollection))
      ..whereRelatedTo('addresses',_customerCollection,customerObject.objectId)
      ..whereEqualTo('isDeleted',false);

    QueryBuilder<ParSEObject> querySubscription = QueryBuilder<ParSEObject>(ParSEObject(_addressesCollection))
      ..whereEqualTo('isDeleted',false)
      ..whereEqualTo('userId',currentUserId);

    ParseResponse response = await query.query();
    Subscription subscription = await liveQuery.client.subscribe(querySubscription);
    if(response.success && response.count != 0) {
      List<UserAddress> addresses = (jsonDecode(response.results.toString()) as List)
        .map((address) => UserAddress.fromMap(address)).toList();

      result.add(addresses);
      result.add(subscription);
      return result;
    } else {
      result.add(false);
      result.add(subscription);
      return result;
    }
  }

免责声明

我使用了两个查询一个用于查询关系,另一个用于订阅,因为当前不支持LiveQueries 派生的 relations。这就是为什么我用了两个。

这个现在用于负责 stream 事件的 subscriptions.on

Stream listenToUserAddressesRealTime(Subscription subscription,List<UserAddress> userAddress) {
    subscription.on(LiveQueryEvent.create,(value) {
        print('*** CREATE ***: ${DateTime.Now().toString()}\n $value ');

        String rawJson = (value as ParSEObject).toString();
        UserAddress createdobject = UserAddress.fromMap(jsonDecode(rawJson));
        userAddress.add(createdobject);
        _addressController.add(userAddress);
    });
    subscription.on(LiveQueryEvent.leave,(value) {
        print('*** LEAVE ***: ${DateTime.Now().toString()}\n $value ');

        String rawJson = (value as ParSEObject).toString();
        UserAddress createdobject = UserAddress.fromMap(jsonDecode(rawJson));
        userAddress.removeWhere((element) => createdobject.objectId == element.objectId);
        _addressController.add(userAddress);
    });
    subscription.on(LiveQueryEvent.delete,(value) {
        print('*** DELETE ***: ${DateTime.Now().toString()}\n $value ');

        String rawJson = (value as ParSEObject).toString();
        UserAddress createdobject = UserAddress.fromMap(jsonDecode(rawJson));
        userAddress.removeWhere((element) => createdobject.objectId == element.objectId);
        _addressController.add(userAddress);
    });
    subscription.on(LiveQueryEvent.enter,(value) {
        print('*** ENTER ***: ${DateTime.Now().toString()}\n $value ');

        String rawJson = (value as ParSEObject).toString();
        UserAddress createdobject = UserAddress.fromMap(jsonDecode(rawJson));
        userAddress.add(createdobject);
        _addressController.add(userAddress);
    });
    subscription.on(LiveQueryEvent.update,(value) {
        print('*** UPDATE ***: ${DateTime.Now().toString()}\n $value ');

        String rawJson = (value as ParSEObject).toString();
        UserAddress createdobject = UserAddress.fromMap(jsonDecode(rawJson));

        var index = userAddress.indexWhere((element) => element.objectId == createdobject.objectId);
        userAddress[index] = createdobject;
        _addressController.add(userAddress);
    });
    
    return _addressController.stream;
  }

在这里尝试完成的是将我的 getMyAddresses()listenToUserAddressesRealTime() 合并为 1 个方法。这就是为什么我正在寻找一些方法来做到这一点。

这在 javascript 中相对简单,因为 subscriptions.on('open')

但是在颤振中我找不到任何其他方法。我在 Flutter 方面的经验还没有真正到位。感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)