Похоже, EventBus
, вероятно, не лучший подход здесь; это одна из главных проблем, с которыми я лично столкнулся с EventBus
: все события являются глобальными, и трудно различить различные события данного типа.
Хороший набор правил для асинхронной обработки событий без общего EventBus
:
- Общение с дочерними виджетами с помощью прямых вызовов методов.
- Связь с родительским виджетом через обратные вызовы / обработчики / слушатели.
- Избегайте прямого знания виджетов-братьев и сестер (возможно, не в этом дело)
Таким образом, виджет, который содержит 3 вкладки, может прикреплять обратные вызовы к каждой вкладке, которая при вызове отправляет каждое событие в соответствующий обработчик событий (я думаю, что в вашем случае Presenters).
Не требуется глобальное общение, знание источников или назначений, только один тип события, один тип виджета с вкладками многократного использования и класс вкладок остается простым. В принципе, не слишком отличается от добавления ValueChangeHandler
к CheckBox
(в конце концов, никто не подписывается на события флажков через шину событий, вы просто добавляете обработчик непосредственно в виджет).
Грубый набросок:
public class TabContainer implements IsWidget {
public TabContainer() {
tab1.addNewPrescriptionHandler(
new NewPrescriptionEventHandler() {
@Override
public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
handleTab1Event(event);
}
});
tab2.addNewPrescriptionHandler(
new NewPrescriptionEventHandler() {
@Override
public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
handleTab2Event(event);
}
});
...
}
}
И вы могли бы даже упростить это с некоторой цикличностью и сопряжением.
С другой стороны, этот контейнер также может отправлять события назад на ваших виджетов откуда угодно, используя те же принципы.
Кроме того, в зависимости от того, что содержит класс Event
, вам может даже не понадобиться класс Event
; Вы можете определить свои обратные вызовы и параметры, как хотите.