问题描述
我正在尝试通过颤振中的流加载对象。目前,我无法找到如何实现这一点的方法,而无需在听之前调用另一个 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
方法的。此函数接受 ParSEObject
的 Customer 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 (将#修改为@)