Cómo usar el GWT EventBus

Todavía no estoy familiarizado con GWT y me pregunto cómo usar EventBus o si hay algunas mejores soluciones para enviar un evento a través del proyecto.

El widget 1 tiene un botón. El widget 2 tiene una etiqueta, que debería cambiar cuando presiono el botón. Estos widgets están en DockLayout:

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get(); DockLayoutPanel dock = new DockLayoutPanel(Unit.EM); dock.addWest(new Widget1(), 10); dock.add(new Widget2()); rootLayoutPanel.add(dock); 

He declarado un handleClickAlert en el Widget 1

 @UiHandler("button") void handleClickAlert(ClickEvent e) { //fireEvent(e); } 

Espero que alguien pueda ayudarme. ¡Gracias!

Cuando divide el proyecto en partes lógicas (por ejemplo, con MVP), a veces las partes diferentes necesitan comunicarse. La comunicación típica es enviar cambios de estado, por ejemplo:

  • usuario conectado / anulado.
  • el usuario navega directamente a través de la URL a la página para que el menú se actualice.

Usar el bus de eventos es bastante lógico en esos casos.

Para usarlo crea una instancia de un EventBus por aplicación que luego es utilizada por todas las otras clases. Para lograr esto, use campo estático, fábrica o dependency injection (GIN en caso de GWT).

Ejemplo con sus propios tipos de eventos:

 public class AppUtils{ public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class); } 

Normalmente también crearías tus propios tipos de eventos y controladores:

 public class AuthenticationEvent extends GwtEvent { public static Type TYPE = new Type(); @Override public Type getAssociatedType() { return TYPE; } @Override protected void dispatch(AuthenticationEventHandler handler) { handler.onAuthenticationChanged(this); } } 

y el controlador:

 public interface AuthenticationEventHandler extends EventHandler { void onAuthenticationChanged(AuthenticationEvent authenticationEvent); } 

Entonces lo usa así:

 AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler() { @Override public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) { // authentication changed - do something } }); 

y dispara el evento:

 AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());