Search code examples
gwtgwtpgwt-platform

GWTP not displaying UI


I'm trying to use GWTP in my GWT 2.7 application but the UI in my uibinder is not displaying. My app compiles and runs in Super dev mode without any errors, but I get a blank screen. I expected the HTML in the LayoutView.ui.xml to show in the browser. I'm sure I'm missing something really basic. Any help would be great.

The following is included in my .gwt.xml file

  <inherits name='com.google.gwt.inject.Inject' />

  <!-- Other module inherits                                      -->
  <inherits name="com.google.gwt.uibinder.UiBinder" />
  <inherits name='com.gwtplatform.mvp.Mvp' />

  <entry-point class="com.clearwood.client.App" />

  <define-configuration-property name="gin.ginjector" is-multi-valued="false" />
  <set-configuration-property name="gin.ginjector"
   value="com.clearwood.client.gin.MyGinjector" /> 

client/App.java

public class App implements EntryPoint {
    public final MyGinjector ginjector = GWT.create(MyGinjector.class);

    @Override
    public void onModuleLoad() {
        DelayedBindRegistry.bind(ginjector);
        ginjector.getPlaceManager().revealCurrentPlace();      
    }
}

client/gin/ClientModule.java

public class ClientModule extends AbstractPresenterModule {
    @Override
    protected void configure() {
        install(new DefaultModule());
        install(new LayoutModule());

        bindConstant().annotatedWith(DefaultPlace.class).to(NameTokens.LAYOUT);
        bindConstant().annotatedWith(ErrorPlace.class).to(NameTokens.LAYOUT);
        bindConstant().annotatedWith(UnauthorizedPlace.class).to(NameTokens.LAYOUT);

        requestStaticInjection(NameTokens.class);
     }
}

client/gin/Ginjector.java

@GinModules({ ClientModule.class })
public interface MyGinjector extends Ginjector {
  EventBus getEventBus();   
  PlaceManager getPlaceManager();
  Provider<LayoutPresenter> getLayoutPresenter();
}

client/place/NameTokens.java

public class NameTokens {
    public static final String LAYOUT = "LAYOUT";
    public static String getLAYOUT() {
        return LAYOUT;
    }
}

client/layout/LayoutView.ui.xml

<!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">
 <g:SimplePanel width="600px" height="auto" ui:field="main">
    <g:HTML width="100%" height="100%">TEST</g:HTML>
 </g:SimplePanel>
</ui:UiBinder>

client/layout/LayoutView.java

class LayoutView extends ViewImpl implements LayoutPresenter.MyView {
    interface Binder extends UiBinder<Widget, LayoutView> {
    }

    @UiField
    SimplePanel main;

    @Inject
    LayoutView(Binder uiBinder) {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Override
    public void setInSlot(Object slot, IsWidget content) {
        if (slot == LayoutPresenter.SLOT_Layout) {
            main.setWidget(content);
        } else {
            super.setInSlot(slot, content);
        }
    }
}

client/layout/LayoutPresenter.java

public class LayoutPresenter extends Presenter<LayoutPresenter.MyView, LayoutPresenter.MyProxy>  {
    interface MyView extends View  {
    }
    @ContentSlot
    public static final Type<RevealContentHandler<?>> SLOT_Layout = new Type<RevealContentHandler<?>>();

    @ProxyStandard
    interface MyProxy extends Proxy<LayoutPresenter> {
    }

    @Inject
    LayoutPresenter(
            EventBus eventBus,
            MyView view, 
            MyProxy proxy) {
        super(eventBus, view, proxy, RevealType.Root);
    }
}

client/layout/LayoutModule.java

public class LayoutModule extends AbstractPresenterModule {
    @Override
    protected void configure() {
        bindPresenter(LayoutPresenter.class, LayoutPresenter.MyView.class, LayoutView.class, LayoutPresenter.MyProxy.class);
    }
 }

I generated the Layout presenter using the GWTP plugin. I tried to follow the sample tutorials at http://dev.arcbees.com/gwtp/sampletutorial/ and https://code.google.com/p/gwt-platform/wiki/GettingStarted#Getting_the_sample_applications but some of it seems to be deprecated


Solution

  • You don't have a presenter with a ProxyPlace and the annotation @NameToken on it. To get your code working quickly, you can change LayoutPresenter.MyProxy to:

    @ProxyStandard
    @NameToken(NameTokens.LAYOUT)
    interface MyProxy extends ProxyPlace<LayoutPresenter> {}
    

    Also the Google Code documentation is actually outdated by a lot. There are warnings all over the place, so I thought this was obvious.

    The documentation on https://dev.arcbees.com/gwtp/sampletutorial/ is recent enough to help you develop a working application. You can also have a look at GWTP's Basic Sample for more examples: https://github.com/ArcBees/GWTP-Samples/tree/master/gwtp-samples/gwtp-sample-basic