2

我分析了HandlerManager看不到它如何处理事件源。第 117 行:

public void fireEvent(GwtEvent<?> event) {
    ...
    Object oldSource = event.getSource();
    event.overrideSource(source);
    try {

      // May throw an UmbrellaException.
      eventBus.fireEvent(event); // <--- LOOK HERE
    } catch (com.google.web.bindery.event.shared.UmbrellaException e) {
      throw new UmbrellaException(e.getCauses());
    } finally {
      ....
    }
}

但是简单的事件总线实现有以下代码,第 86 行:

@Override
public void fireEvent(Event<?> event) {
    doFire(event, null); // <---- SOURCE IS NULL???
}

@Override
public void fireEventFromSource(Event<?> event, Object source) {
    if (source == null) {
      throw new NullPointerException("Cannot fire from a null source");
    }
    doFire(event, source);
}

因此,HandlerManager不会使用源触发事件,因为它总是调用doFire(event, null);

你能说清楚 HandlerManager 如何为源触发事件吗?作为 Widget 中使用的 HandlerManager,它如何只为 Widget 实例触发事件?

4

1 回答 1

2

doFireinSimpleEventBus仅在source参数不是时更改事件的源null

HandlerManager首先设置事件的源,overrideSource然后doFire使用隐式null源调用,这样它就不会覆盖它。

QED。

于 2012-02-07T11:32:54.593 回答