0

我正在使用 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 接口。但是当我点击设置锚点时,presenter 引用仍然为 null,因此 presenter.showSettings() 会抛出 NullPointerException。我想在调用 LoginWidget 的构造函数并通过以下方式初始化小部件之后

initWidget(BINDER.createAndBindUi(this));

我的@UiHandler("settings") 方法中的点击处理代码忽略了对已使用对象的更改,例如我的演示者对象?有没有办法在调用 initWidget() 方法后设置 Presenter 对象?或者是否可以自定义 @UiHandler/initWidget()-behaviour 我可以在之后设置我的演示者?

谢谢,曼努埃尔

4

2 回答 2

0

有很多事情,可能会出错。最简单的方法是尝试通过放置断点handleSettings和“setPresenter”方法来调试代码。我的猜测是正在发生以下情况之一:

  • setPresenter实际上从未被调用

或者

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

或者

  • 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 回答