我分析了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 实例触发事件?