gpt4 book ai didi

dart - 父类的功能需要检测对子类属性的更改

转载 作者:行者123 更新时间:2023-12-03 02:58:14 26 4
gpt4 key购买 nike

我正在尝试为此父“Persistent”类添加功能的方法,以便无论何时更改子对象的任何属性,“changed”属性都将变为true。

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类中存在,而只能在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);
}

上面给了我以下异常(exception):

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)

最佳答案

您可以使用ChangeNotifier类,如该问题的答案中所示

  • Observe package from polymer dart
  • How to use Dart ChangeNotifier class?
    另请参阅
  • 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);
    }

    关于dart - 父类的功能需要检测对子类属性的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25111714/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com