Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: pkg/observe/lib/src/observable_list.dart

Issue 19771010: implement dirty checking for @observable objects (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/observe/lib/src/observable_list.dart
diff --git a/pkg/observe/lib/src/observable_list.dart b/pkg/observe/lib/src/observable_list.dart
index 20213749eecf2eadc606b89e7f4fbf638b90e445..881bd97862ecccf25d153379d080ca91c01f57a8 100644
--- a/pkg/observe/lib/src/observable_list.dart
+++ b/pkg/observe/lib/src/observable_list.dart
@@ -10,9 +10,8 @@ part of observe;
* will be notified.
*/
// TODO(jmesserly): remove implements List<E> once we can extend ListBase<E>
-class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
- implements List<E> {
- List<ListChangeRecord> _records;
+class ObservableList<E> extends ListBase<E> with ChangeNotifierMixin {
+ List<ListChangeRecord> _listRecords;
/** The inner [List<E>] with the actual storage. */
final List<E> _list;
@@ -181,11 +180,17 @@ class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
}
void _recordChange(ListChangeRecord record) {
- if (_records == null) {
- _records = [];
- queueChangeRecords(_summarizeRecords);
+ if (_listRecords == null) {
+ _listRecords = [];
+ runAsync(deliverChanges);
}
- _records.add(record);
+ _listRecords.add(record);
+ }
+
+ bool deliverChanges() {
+ if (_listRecords == null) return false;
+ _summarizeRecords();
+ return super.deliverChanges();
}
/**
@@ -216,7 +221,7 @@ class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
// to the list, then produce the records at the end.
void _summarizeRecords() {
int oldLength = length;
- for (var r in _records) {
+ for (var r in _listRecords) {
oldLength += r.removedCount - r.addedCount;
}
@@ -224,15 +229,15 @@ class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
notifyPropertyChange(const Symbol('length'), oldLength, length);
}
- if (_records.length == 1) {
- notifyChange(_records[0]);
- _records = null;
+ if (_listRecords.length == 1) {
+ notifyChange(_listRecords[0]);
+ _listRecords = null;
return;
}
var items = [];
for (int i = 0; i < oldLength; i++) items.add(i);
- for (var r in _records) {
+ for (var r in _listRecords) {
items.removeRange(r.index, r.index + r.removedCount);
// Represent inserts with -1.
@@ -240,7 +245,7 @@ class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
}
assert(items.length == length);
- _records = null;
+ _listRecords = null;
int index = 0;
int offset = 0;
@@ -274,7 +279,3 @@ class ObservableList<E> extends _ListBaseWorkaround with ObservableMixin
}
}
}
-
-// TODO(jmesserly): bogus type to workaround spurious VM bug with generic base
-// class and mixins.
-abstract class _ListBaseWorkaround extends ListBase<dynamic> {}

Powered by Google App Engine
This is Rietveld 408576698