Dart Documentationclean_dataChangeChildNotificationsMixin

ChangeChildNotificationsMixin abstract class

abstract class ChangeChildNotificationsMixin implements ChangeNotificationsMixin {
 /**
  * Holds pending changes.
  */

 ChangeSet _change;
 ChangeSet _changeSync;

 /**
  * Internal set of listeners for change events on individual data objects.
  */
 Map<dynamic, StreamSubscription> _dataListeners;

 _clearChanges() {
   _change = null;
   _changeSync = null;
 }

 _clearChangesSync() {
   _changeSync = null;
 }

 _markAdded(dynamic key, dynamic value) {
   if (_change == null) {
     _change = new ChangeSet();
   }
   if (_changeSync == null) {
     _changeSync = new ChangeSet();
   }
   if(_onBeforeAddedController != null) _onBeforeAddedController.add(key);
   _changeSync.markAdded(key, value);
   _change.markAdded(key, value);
 }

 _markRemoved(dynamic key, dynamic value) {
   if (_change == null) {
     _change = new ChangeSet();
   }
   if (_changeSync == null) {
     _changeSync = new ChangeSet();
   }
   if(_onBeforeRemovedController != null) _onBeforeRemovedController.add(key);
   _change.markRemoved(key, value);
   _changeSync.markRemoved(key, value);
 }

 _markChanged(dynamic key, dynamic change) {
   if (_change == null) {
     _change = new ChangeSet();
   }
   if (_changeSync == null) {
     _changeSync = new ChangeSet();
   }
   if(change is Change) {
     if(change.oldValue == undefined && _onBeforeAddedController != null)
       _onBeforeAddedController.add(key);
     if(change.newValue == undefined && _onBeforeRemovedController != null)
       _onBeforeRemovedController.add(key);
   }
   _change.markChanged(key, change);
   _changeSync.markChanged(key, change);
 }

 /**
  * Starts listening to changes on [dataObj].
  */
 void _addOnDataChangeListener(key, dataObj) {
   if (_dataListeners == null){
     _dataListeners = {};
   }
   if (_dataListeners.containsKey(key)) {
     throw new Exception('Re-adding listener on key: $key, with dataObj: $dataObj in: $this.');
   }

   _dataListeners[key] = dataObj.onChangeSync.listen((changeEvent) {
     _markChanged(key, changeEvent['change']);
     _notify(author: changeEvent['author']);
   });
 }

 void _removeOnDataChangeListener(key) {
   if (_dataListeners == null){
     return;
   }
   if (_dataListeners.containsKey(key)) {
     _dataListeners[key].cancel();
     _dataListeners.remove(key);
   }
 }

 void _dispose() {
   _closeChangeStreams();
   if(_onBeforeAddedController != null) _onBeforeAddedController.close();
   if(_onBeforeRemovedController != null) _onBeforeRemovedController.close();
   if(_dataListeners != null) _dataListeners.forEach((K, V) => V.cancel());
 }
}

Implements

ChangeNotificationsMixin

Properties

final Stream<dynamic> onBeforeAdd #

inherited from ChangeNotificationsMixin

Stream populated with DataMapView events before any data object is added.

Stream<dynamic> get onBeforeAdd {
 if(_onBeforeAddedController == null) {
   _onBeforeAddedController =
       new StreamController.broadcast(sync: true);
 }
 return _onBeforeAddedController.stream;
}

final Stream<dynamic> onBeforeRemove #

inherited from ChangeNotificationsMixin

Stream populated with DataMapView events before any data object is removed.

Stream<dynamic> get onBeforeRemove {
 if(_onBeforeRemovedController == null) {
   _onBeforeRemovedController =
       new StreamController.broadcast(sync: true);
 }
 return _onBeforeRemovedController.stream;
}

final Stream<ChangeSet> onChange #

inherited from ChangeNotificationsMixin

Stream populated with ChangeSet events whenever the collection or any of data object contained gets changed.

Stream<ChangeSet> get onChange {
 if(_onChangeController == null) {
   _onChangeController =
       new StreamController.broadcast();
 }
 return _onChangeController.stream;
}

final Stream<Map> onChangeSync #

inherited from ChangeNotificationsMixin

Stream populated with {'change': ChangeSet, 'author': dynamic} events synchronously at the moment when the collection or any data object contained gets changed.

Stream<Map> get onChangeSync => _onChangeSyncController.stream;