0

MVPでGWT2.4を使用しています。これが私のビューオブジェクトです:

public class LoginWidget extends Composite implements LoginWidgetView {

interface Binder extends UiBinder<Widget, LoginWidget> {
}

private static final Binder BINDER = GWT.create(Binder.class);

@UiField Anchor settings;

public LoginWidget() {
    initWidget(BINDER.createAndBindUi(this));
}

@UiHandler("settings")
void handleSettingsClick(ClickEvent e) {
    presenter.showSettings();
}

private Presenter presenter;

@Override
public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
}

}

ビューのプレゼンターを

...
getLoginWidget().setPresenter(new LoginWidgetPresenter(placeController));

LoginWidgetPresenterはもちろん、ビューのプレゼンターインターフェイスを実装します。しかし、設定アンカーをクリックすると、プレゼンター参照はまだnullであるため、presenter.showSettings()はNullPointerExceptionをスローします。LoginWidgetのコンストラクターを呼び出し、ウィジェットを初期化した後、

initWidget(BINDER.createAndBindUi(this));

@UiHandler( "settings")メソッドのクリック処理コードは、プレゼンターオブジェクトなどの使用済みオブジェクトへの変更を無視しますか?initWidget()メソッドを呼び出した後にプレゼンターオブジェクトを設定する方法はありますか?または、@ UiHandler / initWidget()をカスタマイズすることは可能ですか?後でプレゼンターを設定できる動作ですか?

ありがとう、マヌエル

4

2 に答える 2

0

うまくいかなかったかもしれないことがたくさんあります。handleSettings最も簡単な方法は、ブレークポイントと'setPresenter'メソッドを配置して、コードのデバッグを試みることです。私の推測では、次のいずれかが発生しています。

  • setPresenter実際に呼び出されることはありません

また

  • getLoginWidget()常にウィジェットの新しいインスタンスを返します。ログインウィジェットの1つのインスタンスにプレゼンターを設定しているが、ウィジェットのまったく異なるインスタンスを表示している可能性は十分にあります。

また

  • getLoginWidget().setPresenter(null)コードのどこかにあります

または他の推測。プレゼンターインスタンスがどこでどのように渡されるかをデバッグし、自分で確認する方がはるかに簡単です。とにかく、UiBinderあなたのフィールド値を消去しません(あなたをからかうために他の誰かによって変更されていない限り)

于 2012-11-26T17:56:21.263 に答える
0

私は別の方法で MVP を実装し、UIBinder は私のもので動作します。おそらく、LoginWidget コンストラクターで LoginWidgetPresenter を渡すと機能します。

public LoginWidget(Presenter presenter) {
    this.presenter = presenter;
    initWidget(BINDER.createAndBindUi(this));
}
...
getLoginWidget(new LoginWidgetPresenter(placeController));
于 2012-11-26T16:44:57.180 に答える