0

我正在尝试组合一个多项目应用程序,其中一个子项目对单个演示者具有多个视图。我正在使用 Gin 将视图注入我的演示者。

子项目包含演示者和 2 个不同的视图。我有 2 个单独的 gin 模块,每个模块将一个视图绑定到视图界面。

根据 Thomas Broyer 对这篇文章的回答的建议,我的 Ginjector 被包装在一个“holder”类中,该类在特定的 ginjector 上调用 GWT.create。使用 replace-with 语句在 gwt.xml 文件中配置适当的持有者。

当我在开发模式下运行我的项目时,我看到备用视图按我的预期出现。但是,当我编译项目时,我仍然只能得到默认视图。此外,只有 6 个排列(由于替换逻辑,我期望更多),并且在不同场景中我没有得到我期望的视图。

这里有一些代码来说明。

Subproject.gwt.xml 包含以下内容:

<replace-with class="com.example.GinjectorDesktopHolder">
    <when-type-is class="com.example.GinjectorHolder" />        
</replace-with>

<replace-with class="com.example.GinjectorTabletHolder">
    <when-type-is class="com.example.GinjectorHolder" />
    <when-property-is name="formfactor" value="tablet" />
</replace-with>

“formfactor”变量是在从 GWT 的mobilewebapp 示例项目中逐字复制的 gwt.xml 中定义的。

Holder 类如下所示:

public abstract class GinjectorHolder {
    public abstract Ginjector getGinjector();
}


public class GinjectorTabletHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorTablet.class);
    }   
}


public class GinjectorDesktopHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorDesktop.class);
    }
}

我的 Ginjectors 看起来像这样:

public interface MyGinjector {
    MyView getView();
    EventBus getEventBus();
}


@GinModules({ModuleDesktop.class})
public interface GinjectorDesktop extends Ginjector, MyGinjector {}


@GinModules({ModuleTablet.class})
public interface GinjectorTablet extends Ginjector, MyGinjector {}

我的模块如下所示:

public class ModuleDesktop extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(DesktopView.class);
    }
}


public class ModuleTablet extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(TabletView.class);
    }
}

最后,在我的演示者代理中,基本上是这个特定子项目的入口点,我有这行:

GinjectorHolder holder = GWT.create(GinjectorHolder.class);
MyGinjector ginjector = holder.getGinjector();      

如前所述,当我在开发模式下运行并设置断点时,我可以看到创建了相应的 GinjectorHolder。FormFactor.gwt.xml(上面链接)提供了一个开关,用于使用 URL 参数切换到您想要查看的上下文。所以我可以在 URL 中执行 formfactor=tablet 并创建 Tablet Ginjector Holder。

4

2 回答 2

1

如评论中所述,删除该行

<collapse-property name="formfactor" values="*"/>

导致排列数量的预期增加。

尽管如此,为什么这是必要的仍然很神秘,因为通常应该可以折叠您喜欢的任何属性 - 这只是意味着每个浏览器都必须下载更多代码,但仍然应该得到它需要的一切。可能是一个错误。

于 2013-08-09T20:03:22.130 回答
0

首先,您可以将视图绑定到 viewprovider,而不是将视图映射到 viewimpl,然后根据用户代理值,您可以返回适当的实例来绑定。

于 2014-02-21T09:18:49.263 回答