0

我已经实现了一个简单的 GWT 应用程序,它使用 1 个 Place 和 1 个 Activity(我已经实现了一个 Presenter,它扩展了一个AbstractActivity并包含一个Composite“视图”子类)。视图中的第一个也是唯一的 UI 对象是一个GWT-Bootstrap NavBar,我希望它出现在我的“主页”的最顶部。

我正在从 Eclipse 内部本地运行应用程序,并且没有收到任何编译器或运行时错误。当我转到开发模式控制台指向的 URL 时,我在浏览器中稍作停顿(我假设这是浏览器“下载”JavaScript),然后我看到一个空白屏幕(而不是我的导航栏) . 窗口标题是正确的(我在模块的 HTML 页面中设置了这个),当我查看源代码时,我看到了相同的 HTML 源代码,所以我知道应用程序的 JavaScript 正在正确地进入浏览器。它只是不渲染导航栏。

System.out.println()在整个onModuleLoad()、我的 default ActivityManagerActivityMapperPlaceHistoryMapper、presenter 和 viewComposite中都添加了语句,所有这些sysout语句都打印在开发控制台中;告诉我我已将所有内容正确连接在一起,并且在运行时PlaceHistoryHandler#handleCurrentHistory(从内部onModuleLoad)调用该方法时,我应该看到我的 NavBar。

我能想到的唯一可能是:

  1. 我配置gwt-bootstrap错误;或者
  2. 我没有正确使用 UiBinder
  3. 我如何使用活动和地点,或者我如何将用户界面附加到RootLayoutPanel内部,还有其他问题onModuleLoad()

至于gwt-bootstrap

  • 我将 JAR 放在项目的类路径中(我知道这一点,因为当我在小部件/视图UiField中包含新类型时NavBar,我没有收到任何编译器错误)
  • 我添加<inherits name="com.github.gwtbootstrap.Bootstrap"/>到我的 GWT 模块 XML

所以如果我还有什么需要配置的,请告诉我!

至于 UiBinder 的东西,这是我的小部件/视图:

public class WebRootDisplay extends BaseDisplay {

    private static WebRootDisplayUiBinder uiBinder = GWT
        .create(WebRootDisplayUiBinder.class);

    interface WebRootDisplayUiBinder extends UiBinder<Widget, WebRootDisplay> {
    }

    @UiField
    Navbar navBar;

    public WebRootDisplay(EventBus eventBus) {
        super(eventBus);

        System.out.println("I get this printing to the console at runtime.");

        initWidget(uiBinder.createAndBindUi(this));

        System.out.println("...and this too!");
    }
}

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
    <g:HTMLPanel>
        <b:Navbar ui:field="navBar">
            <b:Nav>
                <b:NavLink href="http://www.google.com">
                    Home
                </b:NavLink>
            </b:Nav>
        </b:Navbar>
    </g:HTMLPanel>
</ui:UiBinder>

我注意到的一件事是我在 UiBinder XML 中有我的NavBar内部。HTMLPanel我这样做是因为我使用 Google-Eclipse 插件为我生成了一个新的 UiBinder(它自动生成了Composite(然后我将其修改为 extend BaseDisplay,它本身 extends Composite)以及 UiBinder 片段。我想 GWT 希望我把所有这里面的 UI 字段HTMLPanel...(?)

如果我在这里遗漏任何东西,请告诉我。我没有实例化该NavBar字段,因为我相信createAndBindUi对我有用。

如果我的gwt-bootstrap配置和我对 UiBinder 的使用看起来都是正确的,那么显然还有其他问题,我将不得不发布更多代码。我只是想在前两项被排除之前先推迟一下。提前致谢!

更新

这里是onModuleLoad

public void onModuleLoad() {
    // Some homegrown DI stuff. I have verified that the injector works properly.
    ApplicationScope appScope = new ApplicationScope();

    setInjector(new ApplicationInjector(appScope,
        InjectorProvider.newMasterProvider()));

    // Add the sole composite child to the RootLayoutPanel.
    // I have verified that injectWebRootDisplay returns a fully configured
    // WebRootDisplay instance.
    RootLayoutPanel.get().add(injector.injectWebRootDisplay());

    historyHandler.register(placeController, eventBus, defaultPlace);
    historyHandler.handleCurrentHistory();
}
4

4 回答 4

0

你能粘贴onModuleLoad()你的代码的一部分吗?

如果您没有收到任何Exception错误消息,我认为您应该检查是否将视图正确添加到 中RootPanel,或者当您运行应用程序时,您应该检查 中view是否存在并且只是不可见或类似的东西divHTML

乍一看,这UiBinder部分看起来不错。

编辑:onModuleLoad()对我来说并没有说太多,但你可以尝试一下。我总是通过以下方式使用 RootLayoutPanel.get() 方法:

RootLayoutPanel.get("someDivId").add(injector.injectWebRootDisplay());

所以我总是在占位符中添加一个divor ,所以当你得到 RootPanel 时,你可以参考那个 div。我不相信这是必要的,但我第一次看到这个,它工作正常。如果您有任何疑问或问题,请告诉我。:)tableHTMLid

于 2012-11-24T14:59:04.917 回答
0

In my experience with GWT Activities and Places, a common culprit of a blank white page is failing to register the Place's Tokenizer with the PlaceHistoryMapper as so:

/**
 * PlaceHistoryMapper interface is used to attach all places which the
 * PlaceHistoryHandler should be aware of. This is done via the @WithTokenizers
 * annotation or by extending PlaceHistoryMapperWithFactory and creating a
 * separate TokenizerFactory.
 */
@WithTokenizers({
    MyPlace.Tokenizer.class,
    SomeOtherPlace.Tokenizer.class})
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {}

See https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces#PlaceHistoryMapper

Another cause for a white page (particularly when using RootLayoutPanel.get() with a single place is failing to map the place correctly in the ActivityMapper:

/**
 * AppActivityMapper associates each Place with its corresponding
 * {@link Activity}
 * 
 * @param clientFactory
 *            Factory to be passed to activities
 */
public class AppActivityMapper implements ActivityMapper {
    private ClientFactory clientFactory;

    public AppActivityMapper(ClientFactory clientFactory) {
        super();
        this.clientFactory = clientFactory;
    }

    @Override
    public Activity getActivity(Place place) {
        if (place instanceof MyPlace)
            return new MyActivity((MyPlace) place, clientFactory);
        else if (place instanceof SomeOtherPlace)
            return new SomeOtherActivity((SomeOtherPlace) place, clientFactory);

        return null; // If your return null with single place bound to RootLayoutPanel
        // you may get a blank white page
    }
}

See https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces#ActivityMapper

Without a more complete code sample it is impossible to determine exactly what is happening, but the two causes outlined above are common oversights which may help anyone who comes across this thread.

于 2013-03-18T20:39:58.553 回答
0

好吧,我尝试了一个与您的代码完全一样的本地示例,我认为问题不在于 UI 活页夹。到目前为止您提供的代码是正确的,因此很可能错误在其他地方。

最大的嫌疑人是BaseDisplay班级。据我所知,这个类不是来自 GWT 或 gwt-bootstrap。您可以通过更改WebRootDisplay类来快速检查它,因此它扩展了经典的 GWTComposite类而不是BaseDisplay(并暂时禁用所有 mvp 内容)。如果它有效,您就有证据证明问题是由“BaseDisplay”引起的

由于我没有完整的代码,我只能假设它WebRootDisplay也用于显示视图,并且最有可能的错误是当视图被添加到该类时,以前添加的小部件(在你的情况下它是一个 NavBar您在 ) 的构造函数中添加的WebRootDisplay内容被删除。问题很可能出在方法setWidgetinitWidget

于 2012-11-25T22:37:07.593 回答
-1

代替 System.println 使用 GWT.log 消息。然后打开 Javascript 控制台(Firebug 或 Chrome),看看你的代码在哪里结束。GWT.log 将在浏览器控制台中打印出来,因此您可以看到编译后的 JS 代码做了什么。

此外,如果您使用 Pretty 模式进行编译,您将在浏览器中看到生成的 Javascript 代码,并且能够单步执行并查看调用(或不调用)的内容。

于 2012-11-25T15:41:18.413 回答