【发布时间】:2013-08-09 18:37:55
【问题描述】:
我正在尝试组合一个多项目应用程序,其中一个子项目具有针对单个演示者的多个视图。我正在使用 Gin 将视图注入我的演示者。
子项目包含演示者和 2 个不同的视图。我有 2 个单独的 gin 模块,每个模块将一个视图绑定到视图界面。
根据 Thomas Broyer 对this post 答案的建议,我的 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 sample project 逐字复制的 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);
}
}
我的 Ginjector 看起来像这样:
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。
【问题讨论】:
-
您认为应该生成更多排列是正确的。我对 GIN 和 formfactor.js 文件使用了完全相同的配置,我通常得到 16 个 perms。您是否在 .gwt.xml 文件中配置了 user.agent 属性?
-
嗨,克里斯 - 我已经调试到我知道我得到了正确的外形尺寸的水平,因为我能够在我的浏览器中定位和调试 GWT JS。我还在 Safari 中调试了该代码,调试了我的 ipad。所以我确信那部分是有效的。就像我提到的那样,在开发模式下运行时,我确实得到了不同的视图。我唯一能想到的是,我的 gin 模块可能没有在 2 个项目中正确配置。你这样做时是否使用了多个项目?
-
不,我使用一个项目,你如何配置你的 gwt-maven-plugin 来编译两个独立的项目?其他一切看起来都正确,可能是 gwt 编译器在运行时没有看到第二个项目
-
子项目只输出一个JAR文件。只有主项目进行 gwt 编译。现在,我有 2 个实际包含视图的子项目,以及一个包含一些共享代码的公共项目。这 3 个项目只输出一个带有源代码的 JAR。第 4 个项目包含我唯一的 EntryPoint 类。它运行得很好,GWT 编译器正确识别了我的代码拆分。在此更改之前,我对此没有任何问题。
-
当您删除
<collapse-property name="formfactor" values="*"/>行(来自 mobilewebapp 示例)时,它会编译更多排列吗?