我已经分析了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 {
....
}
}
但是simple event bus实现有以下代码,第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 不会使用source触发事件,因为它总是调用 doFire(event,null);
你能说清楚HandlerManager如何为源代码触发事件?作为Widget中使用的HandlerManager,它如何仅为Widget实例触发事件?
答案 0 :(得分:2)
doFire
参数不是SimpleEventBus
,则source
中的{p> null
仅更改事件的来源。
HandlerManager
首先使用overrideSource
设置事件的来源,然后使用隐式doFire
来源调用null
,这样就不会覆盖它。
QED。