Функциональность в родительском классе должна обнаруживать изменения в свойствах дочернего класса

Я пытаюсь найти способ для этого родительского класса "Постоянный", чтобы добавить функциональность так, чтобы "измененное" свойство становилось истинным при каждом изменении какого-либо свойства дочернего объекта.

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 класс, как показано в ответах на этот вопрос

Еще одна попытка - использовать отражение, но это не рекомендуется, особенно в браузере. Приведенное выше решение также использует отражение, но насколько я знаю, преобразователь 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);
}
Другие вопросы по тегам