Cuando divide el proyecto en partes lógicas (por ejemplo, con MVP), algunas partes a veces necesitan comunicarse. La comunicación típica es el envío de cambios de estado, por ejemplo:
- usuario conectado/loged-out.
- usuario navegó directamente a través de la URL a la página para que el menú debe actualizarse.
El uso del 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 demás clases. Para lograr esto, use campo estático, fábrica o inyección de dependencia (GIN en caso de GWT).
Ejemplo con usted el propietario de tipos de eventos:
public class AppUtils{
public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}
Normalmente también se crearía sus propios tipos de eventos y controladores:
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);
}
}
y el manejador:
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 desencadenar el evento:
AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
Gracias. Esto me ayuda mucho! – Mark
Al disparar el evento, ¿cómo podría enviar un objeto? En mi caso, debería enviar una clase que contenga la información de mis usuarios. – elvispt
Puede tener un campo en su evento personalizado y configurarlo a través de un constructor, es decir, 'nuevo AuthenticationEvent (someObject)' –