2

我有一个创建按钮并将侦听器连接到单击事件的类。在子类中,我想替换超类处理程序。此代码添加了一个侦听器:

row.query("[value='Save']").onClick.listen(handleNewAlert);

如何删除现有的侦听器?

4

2 回答 2

6

Stream.listen ()方法返回一个StreamSubscription对象。调用StreamSubscription.cancel()取消事件监听。

var subs = element.onClick.listen((e) => print(e));

// Remove the listener.
subs.cancel();

// Add another listener.
element.onClick.listen((e) => print(e));

有关更多信息,请参阅本文

于 2013-05-14T02:09:34.353 回答
2

Greg 的回答描述了如何取消订阅事件源。这是正确的,但 IMO 有点尴尬,因为您需要保留订阅实例以防任何派生类想要取消它,或者如果您想隐藏详细信息,您需要在基类上为此提供一个方法.

正如您所说,您要替换处理程序,我将其理解为提供不同的实现,一种更简单的方法是handleNewAlert在派生类中简单地覆盖方法。

当然,如果您指定了匿名函数而不是方法名称,则它将不起作用,因为它显然不能被覆盖,但在您的示例中显示的场景中,这可能是一种更简单的方法。

于 2013-05-14T08:05:10.017 回答