Функциональность в родительском классе должна обнаруживать изменения в свойствах дочернего класса
Я пытаюсь найти способ для этого родительского класса "Постоянный", чтобы добавить функциональность так, чтобы "измененное" свойство становилось истинным при каждом изменении какого-либо свойства дочернего объекта.
class Persistent {
bool changed = false;
Persistent() {
print('Something should be added here to make this work.');
}
}
class Child extends Persistent {
num number = 1;
// Nothing should be done in this class to make this work.
}
main() {
Child item = new Child();
item.number = 2;
assert(item.changed == true); //fails
}
Требование: цель состоит в том, чтобы это было прозрачно для класса Child. Функциональность для обнаружения изменений не должна существовать в классе Child, только внутри класса Persistent.
Спасибо экспертам Dart за вашу помощь! С нетерпением жду Вашего ответа.
Вот работа, чтобы получить это работает:
import 'dart:io';
import 'dart:async';
import 'dart:convert';
import 'package:observe/observe.dart';
class Persistent extends Object with ChangeNotifier {
bool changed = false;
Persistent() {
this.changes.listen((List<ChangeRecord> record) => changed = false);
//this.changes.listen((List<ChangeRecord> record) => changed = true); //Same exception
}
}
class Child extends Persistent {
@observable num number = 1;
// Nothing should be done in this class to make this work.
}
main() {
Child item = new Child();
item.number = 2;
assert(item.changed == true);
}
Вышесказанное дает мне следующее исключение:
Unhandled exception:
'file:///home/david/Dropbox/WebDevelopment/DODB/source/DODB/bin/dodb.dart': Failed assertion: line 22 pos 10: 'item.changed == true' is not true.
#0 main (file:///home/david/Dropbox/WebDevelopment/DODB/source/DODB/bin/dodb.dart:22:10)
#1 _startIsolate.isolateStartHandler (dart:isolate-patch/isolate_patch.dart:216)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:124)
1 ответ
Вы можете использовать ChangeNotifier
класс, как показано в ответах на этот вопрос
- Соблюдайте упаковку из полимерного дротика
- Как использовать класс Dart ChangeNotifier?
смотрите также - https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/observe/observe.ChangeNotifier
- https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/observe/observe.Observable
Еще одна попытка - использовать отражение, но это не рекомендуется, особенно в браузере. Приведенное выше решение также использует отражение, но насколько я знаю, преобразователь Smoke генерирует код, который заменяет отражающий код при запуске pub build
,
редактировать
Только после звонка Observable.dirtyCheck();
инициируется обнаружение изменений (для всех наблюдаемых случаев).
import 'package:observe/observe.dart';
class Persistent extends Observable {
bool changed = false;
Persistent() : super() {
changes.listen((e) => changed = true);
}
}
class Child extends Persistent {
@observable num number = 1;
}
main() {
Child item = new Child();
item.number = 2;
Observable.dirtyCheck();
assert(item.changed == true);
}