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
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;