EventBus
をどのように使用するのか、プロジェクトを介してEvent
を送信するためのより良い解決策があるのか疑問に思います。
Widget1
にはButton
があります。 Widget2
にはLabel
があり、ボタンを押すと変わるはずです。これらのウィジェットはDockLayout
にあります:
RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);
dock.addWest(new Widget1(), 10);
dock.add(new Widget2());
rootLayoutPanel.add(dock);
Widget1
でhandleClickAlert
を宣言しました:
@UiHandler("button")
void handleClickAlert(ClickEvent e) {
//fireEvent(e);
}
プロジェクトを論理的な部分に分割する場合(たとえばMVPを使用)、異なる部分が通信する必要がある場合があります。通常、この通信は、ステータスの変更を送信することで行われます。例:
これらの場合、イベントバスの使用は非常に論理的です。
これを使用するには、アプリごとに1つのEventBus
をインスタンス化し、それが他のすべてのクラスで使用されます。これを実現するには、静的フィールド、ファクトリ、または依存性注入(GWTの場合はGIN)を使用します。
独自のイベントタイプの例:
public class AppUtils{
public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}
通常、独自のイベントタイプとハンドラーも作成します。
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);
}
}
ハンドラー:
public interface AuthenticationEventHandler extends EventHandler {
void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}
次に、次のように使用します。
AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler() {
@Override
public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
// authentication changed - do something
}
});
イベントを発生させます:
AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());