Skip to content

Commit 023d98c

Browse files
authored
ParseLiveElement (#376)
* First implementation for ParseLiveElement * ParseLiveElement further implementation * Update parse_live_list.dart * ParseLiveElement working
1 parent 17a4a78 commit 023d98c

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

lib/src/utils/parse_live_list.dart

+64
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,70 @@ class ParseLiveList<T extends ParseObject> {
444444
}
445445
}
446446

447+
class ParseLiveElement<T extends ParseObject> extends ParseLiveListElement<T> {
448+
ParseLiveElement(T object, {bool loaded = false, List<String> includeObject})
449+
: super(object,
450+
loaded: loaded,
451+
updatedSubItems:
452+
ParseLiveList._toIncludeMap(includeObject ?? <String>[])) {
453+
_includes = ParseLiveList._toIncludeMap(includeObject ?? <String>[]);
454+
queryBuilder = QueryBuilder<T>(object.clone(null))
455+
..includeObject(includeObject)
456+
..whereEqualTo(keyVarObjectId, object.objectId);
457+
_init(object, loaded: loaded, includeObject: includeObject);
458+
}
459+
460+
Subscription<T> _subscription;
461+
Map<String, dynamic> _includes;
462+
QueryBuilder<T> queryBuilder;
463+
464+
Future<void> _init(T object,
465+
{bool loaded = false, List<String> includeObject}) async {
466+
if (!loaded) {
467+
final ParseResponse parseResponse = await queryBuilder.query();
468+
if (parseResponse.success) {
469+
super.object = parseResponse.result.first;
470+
}
471+
}
472+
473+
_subscription = await LiveQuery().client.subscribe<T>(
474+
QueryBuilder<T>.copy(queryBuilder),
475+
copyObject: object.clone(null));
476+
477+
_subscription.on(LiveQueryEvent.update, (T newObject) async {
478+
await ParseLiveList._loadIncludes(newObject,
479+
oldObject: super.object, paths: _includes);
480+
super.object = newObject;
481+
});
482+
483+
LiveQuery()
484+
.client
485+
.getClientEventStream
486+
.listen((LiveQueryClientEvent event) {
487+
_subscriptionQueue.whenComplete(() async {
488+
// ignore: missing_enum_constant_in_switch
489+
switch (event) {
490+
case LiveQueryClientEvent.CONNECTED:
491+
final ParseResponse parseResponse = await queryBuilder.query();
492+
if (parseResponse.success) {
493+
super.object = parseResponse.result.first;
494+
}
495+
break;
496+
}
497+
});
498+
});
499+
}
500+
501+
@override
502+
void dispose() {
503+
if (_subscription != null) {
504+
LiveQuery().client.unSubscribe(_subscription);
505+
_subscription = null;
506+
}
507+
super.dispose();
508+
}
509+
}
510+
447511
class ParseLiveListElement<T extends ParseObject> {
448512
ParseLiveListElement(this._object,
449513
{bool loaded = false, Map<String, dynamic> updatedSubItems}) {

0 commit comments

Comments
 (0)