【问题标题】:How to use or create an Observer Pattern in Dart (specially for class properties)如何在 Dart 中使用或创建观察者模式(特别是对于类属性)
【发布时间】:2020-06-05 23:35:47
【问题描述】:

我在尝试找到在 Dart 中使用观察者模式的标准方法时遇到了麻烦;我发现的几乎所有东西都非常过时或带有已弃用的软件包。

我要找的很接近this answer(过时的),其中@observable用在一个属性之上,然后你就可以监听到属性的变化了(非常类似于TypeScript中的Angular )。使用ChangeNotifier 类也可以达到类似的效果,但它位于其中一个 Flutter 包中(foundation),所以我认为这不是标准方式,否则它将是一个简单的 Dart 包。

我还发现了另外 2 个简洁的软件包,它们确实提供了与我的想法相近的东西:property_change_notifier 和 simple_observable。

无论如何,我想知道是否有一个简单的方法可以将 Observer 功能添加到类属性中。我正在考虑将属性(实际上是基于该属性的另一个 getter)转换为Stream,每次调用该属性上的设置器时,yield 都会产生一个新值。或者让 setter 也将 Stream 作为参数,并在属性更改后将值传递给 Stream(是否可以在外部将值附加到 Stream?)。

【问题讨论】:

    标签: asynchronous flutter events dart observer-pattern


    【解决方案1】:

    您可以使用StreamView 使类实现流接口——这是可观察的。

    这是一个例子:

    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 的基本反应特性吗?
    • 关于您的代码,当我连续多次尝试counter.increment() 时,它只打印最后一个值,例如10 个增量将打印 10 倍的数字 10。它不应该打印 0、1、2...、10 吗?即每个增量都会触发您传递给 listen? 的 lambda 函数
    • 如果你想要同步你的StreamController
    • 为了我的改进,拒绝我的编辑建议的原因是什么?
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2013-09-11
    • 2020-12-26
    • 2013-12-09
    • 2021-09-20
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多