diff --git a/lib/src/network/parse_live_query.dart b/lib/src/network/parse_live_query.dart index 424539e9d..487fb3002 100644 --- a/lib/src/network/parse_live_query.dart +++ b/lib/src/network/parse_live_query.dart @@ -13,9 +13,12 @@ enum LiveQueryEvent { create, enter, update, leave, delete, error } const String _printConstLiveQuery = 'LiveQuery: '; -class Subscription { - Subscription(this.query, this.requestId); - QueryBuilder query; +class Subscription { + Subscription(this.query, this.requestId, {T copyObject}) { + _copyObject = copyObject; + } + QueryBuilder query; + T _copyObject; int requestId; bool _enabled = false; final List _liveQueryEvent = [ @@ -30,6 +33,10 @@ class Subscription { void on(LiveQueryEvent op, Function callback) { eventCallbacks[_liveQueryEvent[op.index]] = callback; } + + T get copyObject { + return _copyObject; + } } enum LiveQueryClientEvent { CONNECTED, DISCONNECTED, USER_DISCONNECTED } @@ -52,7 +59,6 @@ class LiveQueryReconnectingController with WidgetsBindingObserver { LiveQueryReconnectingController( this._reconnect, this._eventStream, this.debug) { - Connectivity().checkConnectivity().then(_connectivityChanged); Connectivity().onConnectivityChanged.listen(_connectivityChanged); @@ -81,7 +87,7 @@ class LiveQueryReconnectingController with WidgetsBindingObserver { WidgetsBinding.instance.addObserver(this); } - void _connectivityChanged(ConnectivityResult state){ + void _connectivityChanged(ConnectivityResult state) { if (!_isOnline && state != ConnectivityResult.none) _retryState = 0; _isOnline = state != ConnectivityResult.none; if (debug) print('$DEBUG_TAG: $state'); @@ -107,9 +113,9 @@ class LiveQueryReconnectingController with WidgetsBindingObserver { retryInterval[_retryState] >= 0) { _currentTimer = Timer(Duration(milliseconds: retryInterval[_retryState]), () { - _currentTimer = null; - _reconnect(); - }); + _currentTimer = null; + _reconnect(); + }); if (debug) print('$DEBUG_TAG: Retrytimer set to ${retryInterval[_retryState]}ms'); if (_retryState < retryInterval.length - 1) _retryState++; @@ -128,7 +134,7 @@ class Client { _client = client ?? ParseHTTPClient( sendSessionId: - autoSendSessionId ?? ParseCoreData().autoSendSessionId, + autoSendSessionId ?? ParseCoreData().autoSendSessionId, securityContext: ParseCoreData().securityContext); _debug = isDebugEnabled(objectLevelDebug: debug); @@ -142,7 +148,7 @@ class Client { } reconnectingController = LiveQueryReconnectingController( - () => reconnect(userInitialized: false), getClientEventStream, _debug); + () => reconnect(userInitialized: false), getClientEventStream, _debug); } static Client get instance => _getInstance(); static Client _instance; @@ -206,13 +212,16 @@ class Client { .add(LiveQueryClientEvent.USER_DISCONNECTED); } - Future subscribe(QueryBuilder query) async { + Future> subscribe( + QueryBuilder query, + {T copyObject}) async { if (_webSocket == null) { await _clientEventStream.any((LiveQueryClientEvent event) => - event == LiveQueryClientEvent.CONNECTED); + event == LiveQueryClientEvent.CONNECTED); } final int requestId = _requestIdGenerator(); - final Subscription subscription = Subscription(query, requestId); + final Subscription subscription = + Subscription(query, requestId, copyObject: copyObject); _requestSubScription[requestId] = subscription; //After a client connects to the LiveQuery server, //it can send a subscribe message to subscribe a ParseQuery. @@ -220,7 +229,7 @@ class Client { return subscription; } - void unSubscribe(Subscription subscription) { + void unSubscribe(Subscription subscription) { //Mount message for Unsubscribe final Map unsubscribeMessage = { 'op': 'unsubscribe', @@ -382,10 +391,12 @@ class Client { final String className = map['className']; if (className == '_User') { subscription.eventCallbacks[actionData['op']]( - ParseUser(null, null, null).fromJson(map)); + (subscription.copyObject ?? ParseUser(null, null, null)) + .fromJson(map)); } else { subscription.eventCallbacks[actionData['op']]( - ParseObject(className).fromJson(map)); + (subscription.copyObject ?? ParseObject(className)) + .fromJson(map)); } } else { subscription.eventCallbacks[actionData['op']](actionData); @@ -399,7 +410,7 @@ class LiveQuery { _client = client ?? ParseHTTPClient( sendSessionId: - autoSendSessionId ?? ParseCoreData().autoSendSessionId, + autoSendSessionId ?? ParseCoreData().autoSendSessionId, securityContext: ParseCoreData().securityContext); _debug = isDebugEnabled(objectLevelDebug: debug); diff --git a/lib/src/network/parse_query.dart b/lib/src/network/parse_query.dart index 03b0dc3ae..9a785e0e7 100644 --- a/lib/src/network/parse_query.dart +++ b/lib/src/network/parse_query.dart @@ -296,13 +296,14 @@ class QueryBuilder { /// Finishes the query and calls the server /// /// Make sure to call this after defining your queries - Future query() async { - return object.query(buildQuery()); + Future query() async { + return object.query(buildQuery()); } - Future distinct(String className) async { + Future distinct( + String className) async { final String queryString = 'distinct=$className'; - return object.distinct(queryString); + return object.distinct(queryString); } ///Counts the number of objects that match this query diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index 813917907..b89368736 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -84,7 +84,9 @@ class ParseObject extends ParseBase implements ParseCloneable { final Uri url = getSanitisedUri(_client, '$_path/$objectId'); final String body = json.encode(toJson(forApiRQ: true)); _saveChanges(); - final Map headers = {keyHeaderContentType:keyHeaderContentTypeJson}; + final Map headers = { + keyHeaderContentType: keyHeaderContentTypeJson + }; final Response result = await _client.put(url, body: body, headers: headers); return handleResponse( @@ -483,8 +485,7 @@ class ParseObject extends ParseBase implements ParseCloneable { _savingChanges.remove(key); if (offlineOnly) { - return ParseResponse() - ..success = true; + return ParseResponse()..success = true; } try { @@ -499,8 +500,7 @@ class ParseObject extends ParseBase implements ParseCloneable { _unsavedChanges[key] = object; _savingChanges[key] = object; } else { - return ParseResponse() - ..success = true; + return ParseResponse()..success = true; } } } on Exception { @@ -509,27 +509,26 @@ class ParseObject extends ParseBase implements ParseCloneable { _savingChanges[key] = object; } - return ParseResponse() - ..success = false; + return ParseResponse()..success = false; } /// Can be used to create custom queries - Future query(String query) async { + Future query(String query) async { try { final Uri url = getSanitisedUri(_client, '$_path', query: query); final Response result = await _client.get(url); - return handleResponse( + return handleResponse( this, result, ParseApiRQ.query, _debug, parseClassName); } on Exception catch (e) { return handleException(e, ParseApiRQ.query, _debug, parseClassName); } } - Future distinct(String query) async { + Future distinct(String query) async { try { final Uri url = getSanitisedUri(_client, '$_aggregatepath', query: query); final Response result = await _client.get(url); - return handleResponse( + return handleResponse( this, result, ParseApiRQ.query, _debug, parseClassName); } on Exception catch (e) { return handleException(e, ParseApiRQ.query, _debug, parseClassName); @@ -537,13 +536,14 @@ class ParseObject extends ParseBase implements ParseCloneable { } /// Deletes the current object locally and online - Future delete({String id, String path}) async { + Future delete( + {String id, String path}) async { try { path ??= _path; id ??= objectId; final Uri url = getSanitisedUri(_client, '$_path/$id'); final Response result = await _client.delete(url); - return handleResponse( + return handleResponse( this, result, ParseApiRQ.delete, _debug, parseClassName); } on Exception catch (e) { return handleException(e, ParseApiRQ.delete, _debug, parseClassName); diff --git a/lib/src/utils/parse_live_list.dart b/lib/src/utils/parse_live_list.dart index bf20361fe..1d9bf0a39 100644 --- a/lib/src/utils/parse_live_list.dart +++ b/lib/src/utils/parse_live_list.dart @@ -80,7 +80,7 @@ class ParseLiveList { query.keysToReturn(List()); } - return await query.query(); + return await query.query(); } Future _init() async { @@ -96,8 +96,9 @@ class ParseLiveList { LiveQuery() .client - .subscribe(QueryBuilder.copy(_query)) - .then((Subscription subscription) { + .subscribe(QueryBuilder.copy(_query), + copyObject: _query.object.clone(_query.object.toJson())) + .then((Subscription subscription) { _liveQuerySubscription = subscription; subscription.on(LiveQueryEvent.create, _objectAdded); subscription.on(LiveQueryEvent.update, _objectUpdated); @@ -131,7 +132,7 @@ class ParseLiveList { .isAfter(currentObject.get(keyVarUpdatedAt))) { QueryBuilder queryBuilder = QueryBuilder.copy(_query) ..whereEqualTo(keyVarObjectId, currentObjectId); - queryBuilder.query().then((ParseResponse result) { + queryBuilder.query().then((ParseResponse result) { if (result.success) { _objectUpdated(result.results.first); } @@ -206,7 +207,7 @@ class ParseLiveList { ..whereEqualTo( keyVarObjectId, _list[index].object.get(keyVarObjectId)) ..setLimit(1); - final ParseResponse response = await queryBuilder.query(); + final ParseResponse response = await queryBuilder.query(); if (response.success && response.results != null) { _list[index].object = response.results.first; } else {