如何在 Dart 中使用或创建观察者模式(特别是 class 属性)
How to use or create an Observer Pattern in Dart (specially for class properties)
我无法找到在 Dart 中使用观察者模式的标准方法;我发现的几乎所有东西都非常过时或包含已弃用的软件包。
我要找的是非常接近this answer(过时),其中@observable
被用在属性之上,然后你可以听变化到 属性(非常类似于 TypeScript 中的 Angular)。 ChangeNotifier
class 可以达到类似的效果,但它在 Flutter 包之一(foundation
)中,所以我认为这不是标准方式,否则它会是一个简单的 Dart 包。
我还发现了另外 2 个简洁的软件包,它们提供的东西与我的想法相近:property_change_notifier and simple_observable。
无论如何,我想知道是否有一个简单的方法可以将 Observer 功能添加到 class 属性。我正在考虑将 属性(实际上是另一个基于 属性 的 getter)变成 Stream
,这会 yield
一个新值属性 上的 setter 被调用的时间。或者让 setter 也将 Stream
作为参数,并在 属性 更改后将值传递给 Stream
(是否可以附加一个值到外部流?)。
您可以使用 StreamView
来实现 class 实现流接口——这是可观察的。
这是一个例子:
class Counter extends StreamView<Counter> {
Counter._(this._controller) : super(_controller.stream);
factory Counter() => Counter._(StreamController());
final StreamController<Counter> _controller;
Future<void> close() => _controller.close();
int _count = 0;
int get count => _count;
void increment() {
_count++;
_controller.add(this);
}
}
这允许你做:
void main() {
final counter = Counter();
counter.listen((value) {
print(value.count);
});
}
我无法找到在 Dart 中使用观察者模式的标准方法;我发现的几乎所有东西都非常过时或包含已弃用的软件包。
我要找的是非常接近this answer(过时),其中@observable
被用在属性之上,然后你可以听变化到 属性(非常类似于 TypeScript 中的 Angular)。 ChangeNotifier
class 可以达到类似的效果,但它在 Flutter 包之一(foundation
)中,所以我认为这不是标准方式,否则它会是一个简单的 Dart 包。
我还发现了另外 2 个简洁的软件包,它们提供的东西与我的想法相近:property_change_notifier and simple_observable。
无论如何,我想知道是否有一个简单的方法可以将 Observer 功能添加到 class 属性。我正在考虑将 属性(实际上是另一个基于 属性 的 getter)变成 Stream
,这会 yield
一个新值属性 上的 setter 被调用的时间。或者让 setter 也将 Stream
作为参数,并在 属性 更改后将值传递给 Stream
(是否可以附加一个值到外部流?)。
您可以使用 StreamView
来实现 class 实现流接口——这是可观察的。
这是一个例子:
class Counter extends StreamView<Counter> {
Counter._(this._controller) : super(_controller.stream);
factory Counter() => Counter._(StreamController());
final StreamController<Counter> _controller;
Future<void> close() => _controller.close();
int _count = 0;
int get count => _count;
void increment() {
_count++;
_controller.add(this);
}
}
这允许你做:
void main() {
final counter = Counter();
counter.listen((value) {
print(value.count);
});
}