GWT Null对象在@UiHandler方法中

时间:2012-11-26 16:15:29

标签: gwt mvp uibinder

我正在使用GWT 2.4和MVP。 这是我的视图对象:

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当然实现了视图的Presenter接口。但是,当我单击设置锚点时,演示者引用仍然为null,因此presenter.showSettings()会抛出NullPointerException。 我想在调用LoginWidget的构造函数并通过

初始化小部件之后
initWidget(BINDER.createAndBindUi(this));

我的@UiHandler(“设置”)方法中的点击处理代码忽略了对所用对象的更改,比如我的presenter对象? 有没有办法在调用initWidget()方法后设置presenter对象? 或者是否可以自定义@UiHandler / initWidget() - 我之后可以设置我的演示者的行为?

谢谢,Manuel

2 个答案:

答案 0 :(得分:0)

我以另一种方式实现MVP,UIBinder为我的工作。也许如果你在LoginWidget构造函数中传递LoginWidgetPresenter它就可以了。

public LoginWidget(Presenter presenter) {
    this.presenter = presenter;
    initWidget(BINDER.createAndBindUi(this));
}
...
getLoginWidget(new LoginWidgetPresenter(placeController));

答案 1 :(得分:0)

有很多事情可能会出错。最简单的方法是尝试调试代码,方法是使用断点handleSettings和'setPresenter'方法。 我的猜测是发生以下情况之一:

  • setPresenter实际上从未被称为

  • getLoginWidget()总是返回窗口小部件的新实例,很有可能您在登录窗口小部件的一个实例上设置演示者,但显示完全不同的窗口小部件实例

  • 您的代码中有getLoginWidget().setPresenter(null)

或任何其他猜测。调试更容易,并亲自了解presenter实例的传递位置和方式。无论如何,UiBinder不会删除你的字段值(除非被其他人修改以取笑你)