【问题标题】:How to implement an eventable type in Dart如何在 Dart 中实现事件类型
【发布时间】:2013-05-09 13:55:26
【问题描述】:

是否有内置功能可以在 dart 中创建可事件类型?

在我的 Javascript 应用程序中,我使用一个名为 Eventable 的类来提供以下功能:

var dog = new Dog() //where Dog inherits from Eventable
var cat = new Cat() //where Cat inherits from Eventable

//use 'on' to listen to events
cat.on(dog, 'bark', cat.runaway); //assuming Cat has a method runaway on its prototype

//use fire to launch events
dog.fire({type: 'bark'});  //this causes cat.runaway(event); to be called

javascript 中一种非常常见的模式,我喜欢它,因为它可以帮助我将对象隔离在 src 和我的脑海中。

使用on 方法创建一个new EventContract,它具有基于所有者(以上cat)、客户端(以上dog)、类型(以上'bark')和功能(@987654327)的唯一键@ 以上)。这个唯一键允许我确保不会创建重复的 EventContracts,但更重要的是,它允许我保留一个易于查找对象所有 EventContracts 的集合,以便我可以调用:

cat.dispose();

cat 的所有事件合约都将被销毁,因此我确信所有对 cat 的外部引用都已被删除,并且现在可以对 cat 进行 GC。

但我发现很难在 Dart 中实现此功能,因为执行以下操作:cat.on(dog, 'bark', cat.runaway); 会导致生成一个新函数以包含 (){cat.runaway();} 以及我可以从标准函数对象中获取的唯一唯一键在 dart 中是它的 hashCode,但这意味着我可以回忆起 cat.on(dog, 'bark', cat.runaway);,它会创建一个新的 EventContract,因为它创建了另一个独特的闭包,而不是像在 javascript 中那样处理对原始函数的引用。

我有没有办法在飞镖中实现这种模式?

【问题讨论】:

    标签: events design-patterns dart


    【解决方案1】:

    一般来说,你应该使用Stream 作为在 Dart 中提供一系列事件的惯用方式。此外,最好在源上明确声明事件(例如 onBark 而不是 on['bark']。这样的事情应该可以帮助您开始:

    class Dog {
      var _barkController = new StreamController();
      Stream get onBark => _barkController.stream.asBroadcastStream();
      void bark() => _barkController.add("woof");
    }
    
    class Cat {
      void runaway() => print("cat running");
    }
    
    void main() {
      var dog = new Dog();
      var cat = new Cat();
    
      // listen returns subscription object which you can use to unsubscribe
      var sub = dog.onBark.listen((event) => cat.runaway()); 
    
      dog.bark();  // prints 'cat running'
      sub.cancel();
      dog.bark();  // doesn't print anything
    }
    

    如果你喜欢动态声明事件,你可以这样:

      var sub = dog.on['bark'].listen((event) => cat.runaway()); 
      // in this case `on` is a property of some Events type which overrides
      // operator[] to return appropriate Stream
    

    已经有一个类似的Events class,用于在 DOM 元素上提供浏览器事件。

    此外,还有社区库 event_streamevent_source 可以稍微简化此任务。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2022-11-14
    • 1970-01-01
    • 2020-02-09
    • 2016-02-18
    • 2021-10-23
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多