I wonder how to use the EventBus
or whether there are some better solutions to send an Event
through the project.
Widget1
has a Button
. Widget2
has a Label
, that should change when I press the button. These widgets are in a DockLayout
:
RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);
dock.addWest(new Widget1(), 10);
dock.add(new Widget2());
rootLayoutPanel.add(dock);
I have declared an handleClickAlert
in Widget1
:
@UiHandler("button")
void handleClickAlert(ClickEvent e) {
//fireEvent(e);
}
EventBus dispatches Events to interested parties. It eases decoupling by allowing objects to interact without having direct dependencies upon one another, and without requiring event sources to deal with maintaining handler lists.
When you divide the project into logical parts (for example with MVP), then the different parts sometimes need to communicate. Typical this communication is done by sending status changes, e.g.:
Using the event bus is quite logical in those cases.
To use it you instantiate one EventBus
per app which is then used by all other classes. To achieve this use a static field, factory or dependency injection (GIN in case of GWT).
Example with your own event types:
public class AppUtils{ public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class); }
Normally you'd also create your own event types and handlers:
public class AuthenticationEvent extends GwtEvent<AuthenticationEventHandler> { public static Type<AuthenticationEventHandler> TYPE = new Type<AuthenticationEventHandler>(); @Override public Type<AuthenticationEventHandler> getAssociatedType() { return TYPE; } @Override protected void dispatch(AuthenticationEventHandler handler) { handler.onAuthenticationChanged(this); } }
and the handler:
public interface AuthenticationEventHandler extends EventHandler { void onAuthenticationChanged(AuthenticationEvent authenticationEvent); }
Then you use it like this:
AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler() { @Override public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) { // authentication changed - do something } });
and fire the event:
AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With