我正在使用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
答案 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
不会删除你的字段值(除非被其他人修改以取笑你)