Je me demande comment utiliser le EventBus
ou s'il existe de meilleures solutions pour envoyer un Event
à travers le projet.
Widget1
a un Button
. Widget2
a un Label
, qui devrait changer lorsque j'appuie sur le bouton. Ces widgets sont dans un DockLayout
:
RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);
dock.addWest(new Widget1(), 10);
dock.add(new Widget2());
rootLayoutPanel.add(dock);
J'ai déclaré un handleClickAlert
dans Widget1
:
@UiHandler("button")
void handleClickAlert(ClickEvent e) {
//fireEvent(e);
}
Lorsque vous divisez le projet en parties logiques (par exemple avec MVP), les différentes parties doivent parfois communiquer. Typiquement, cette communication se fait en envoyant des changements d'état, par exemple:
L'utilisation du bus d'événements est tout à fait logique dans ces cas.
Pour l'utiliser, vous instanciez un EventBus
par application qui est ensuite utilisé par toutes les autres classes. Pour cela, utilisez un champ statique, une injection d'usine ou de dépendance (GIN en cas de GWT).
Exemple avec vos propres types d'événements:
public class AppUtils{
public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}
Normalement, vous créez également vos propres types d'événements et gestionnaires:
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);
}
}
et le gestionnaire:
public interface AuthenticationEventHandler extends EventHandler {
void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}
Ensuite, vous l'utilisez comme ceci:
AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler() {
@Override
public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
// authentication changed - do something
}
});
et déclencher l'événement:
AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());