Java GWTP每次创建新的演示者

Java GWTP每次创建新的演示者,java,gwtp,gwt-platform,Java,Gwtp,Gwt Platform,我有: 简单嵌套的presenter(ChannelPresenter),其中包含包含记录的表(网格)。我需要在每个ChannelPresenter.displayEditor()调用中创建新的ChannelEditorPresenter实例 Popup Presenter小部件(ChannelEditorPresenter),它应该在每个ChannelEditorPresenter.edit()调用中显示Popup 目前,我正在将ChannelEditorPresenter注入Channe

我有:

  • 简单嵌套的presenter(ChannelPresenter),其中包含包含记录的表(网格)。我需要在每个ChannelPresenter.displayEditor()调用中创建新的ChannelEditorPresenter实例
  • Popup Presenter小部件(ChannelEditorPresenter),它应该在每个ChannelEditorPresenter.edit()调用中显示Popup
目前,我正在将ChannelEditorPresenter注入ChannelPresenter构造函数,但在本例中,我只有ChannelEditorPresenter的一个实例。事实上,我需要为每个电话单独的弹出式演示。(许多单独的窗口,每个窗口都有自己的数据)

ChannelPresenter.java:

public class ChannelPresenter extends Presenter<ChannelPresenter.MyView, ChannelPresenter.MyProxy> implements ChannelUiHandlers {

    public interface MyView extends View, HasUiHandlers<ChannelUiHandlers> {
        void load();
    }

    @ProxyStandard
    @NameToken(NameTokens.CHANNELS)
    interface MyProxy extends ProxyPlace<ChannelPresenter> {
    }

    ChannelEditorPresenter channelEditorPresenter;

    @Inject
    ChannelPresenter(EventBus eventBus, MyView view, MyProxy proxy,
                     ChannelEditorPresenter channelEditorPresenter
                     ) {
        super(eventBus, view, proxy, ApplicationPresenter.SLOT_MAIN);
        getView().setUiHandlers(this);
        this.channelEditorPresenter = channelEditorPresenter;
    }

    @Override
    protected void onBind() {
        super.onBind();
        getView().load();
    }

    @Override
    public void displayEditor(Channel channel) {
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        //  Here I need to create new instance for each call
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        addToPopupSlot(channelEditorPresenter);
        channelEditorPresenter.edit(channel);
    }
}
公共类ChannelPresenter扩展Presenter实现ChannelUIHandler{
公共接口MyView扩展了视图,HasUiHandlers{
空荷载();
}
@ProxyStandard
@NameToken(NameTokens.CHANNELS)
接口MyProxy扩展了ProxyPlace{
}
ChannelEditorPresenter ChannelEditorPresenter;
@注入
ChannelPresenter(EventBus、EventBus、MyView视图、MyProxy代理、,
ChannelEditorPresenter ChannelEditorPresenter
) {
超级(eventBus、view、proxy、ApplicationPresenter.SLOT_MAIN);
getView().setUiHandlers(此);
this.channelEditorPresenter=channelEditorPresenter;
}
@凌驾
受保护的void onBind(){
super.onBind();
getView().load();
}
@凌驾
公共无效显示编辑器(频道){
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//在这里,我需要为每个调用创建新实例
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
addToPopupSlot(channelEditorPresenter);
channelEditorPresenter.edit(频道);
}
}
我在这里找到了解决方案:

我需要注入com.google.Inject.Provider,而不是普通的ChannelEditorPresenter

ChannelPresenter.java:

public class ChannelPresenter extends Presenter<ChannelPresenter.MyView, ChannelPresenter.MyProxy> implements ChannelUiHandlers {

    public interface MyView extends View, HasUiHandlers<ChannelUiHandlers> {
        void load();
    }

    @ProxyStandard
    @NameToken(NameTokens.CHANNELS)
    interface MyProxy extends ProxyPlace<ChannelPresenter> {
    }

    Provider<ChannelEditorPresenter> channelEditorPresenterProvider;

    @Inject
    ChannelPresenter(EventBus eventBus, MyView view, MyProxy proxy,
                     Provider<ChannelEditorPresenter> channelEditorPresenterProvider
                     ) {
        super(eventBus, view, proxy, ApplicationPresenter.SLOT_MAIN);
        getView().setUiHandlers(this);
        this.channelEditorPresenterProvider = channelEditorPresenterProvider;
    }

    @Override
    protected void onBind() {
        super.onBind();
        getView().load();
    }

    @Override
    public void displayEditor(Channel channel) {
        ChannelEditorPresenter channelEditorPresenter = channelEditorPresenterProvider.get();
        addToPopupSlot(channelEditorPresenter);
        channelEditorPresenter.edit(channel);
    }
}
公共类ChannelPresenter扩展Presenter实现ChannelUIHandler{
公共接口MyView扩展了视图,HasUiHandlers{
空荷载();
}
@ProxyStandard
@NameToken(NameTokens.CHANNELS)
接口MyProxy扩展了ProxyPlace{
}
提供者channelEditorPresenterProvider;
@注入
ChannelPresenter(EventBus、EventBus、MyView视图、MyProxy代理、,
提供者channelEditorPresenterProvider
) {
超级(eventBus、view、proxy、ApplicationPresenter.SLOT_MAIN);
getView().setUiHandlers(此);
this.channelEditorPresenterProvider=channelEditorPresenterProvider;
}
@凌驾
受保护的void onBind(){
super.onBind();
getView().load();
}
@凌驾
公共无效显示编辑器(频道){
ChannelEditorPresenter ChannelEditorPresenter=channelEditorPresenterProvider.get();
addToPopupSlot(channelEditorPresenter);
channelEditorPresenter.edit(频道);
}
}

我们最近也遇到了同样的问题,我们发现最好的方法是使用WidgetsFactory和@Assisted注释,正如Arcbees的一篇博文中提到的:

这非常有用,尤其是当您需要将不同的参数传递给presenter小部件的构造函数时