Search code examples
gwtgwt-gin

GWT - binding activityMapper with GIN not working


I´m trying to do my first steps with GWT/GIN.

I´ve downloaded the hellomvp example from google and followed this tutorial to get started with gin.

My problem is about this line in the configure-method of the HelloGinModule-class:

bind(ActivityMapper.class).to(AppActivityMapper.class).in(Singleton.class);

In my point of view it should bind my class "AppActivityMapper" as the active ActityManager. But in fact the class constructor (or any method of the class) is never called, so the fired events are not caught.

The class AppActivityMapper looks like this:

public class AppActivityMapper implements ActivityMapper {

       Provider<HelloActivity> helloActivityProvider;
       Provider<GoodbyeActivity> goodbyeActivityProvider;

       @Inject
       public AppActivityMapper(final Provider<HelloActivity> helloActivityProvider, final Provider<GoodbyeActivity> goodbyeActivityProvider) {
           this.helloActivityProvider = helloActivityProvider;
           this.goodbyeActivityProvider = goodbyeActivityProvider;
       }


       @Override
       public Activity getActivity(Place place) {
           if (place instanceof HelloPlace) {
               return helloActivityProvider.get();
           } else if (place instanceof GoodbyePlace) {
               return goodbyeActivityProvider.get();            
           }

           return null;
       }
}

In my example this code from my View-Class is called after clicking on a link:

presenter.goTo(new GoodbyePlace(name)); 

The event is fired to the event bus. But nothing happens.

Thanks in advance


Solution

  • You have defined an activity mapper somewhere in you GIN. But activity mapper have to be used in activity manager. Where do you create activity manager which will use your AppActivityMapper? UPDATE:

    The most logical thing is to keep activity manager out of the gin. E.g. in your ginjector you will have a method:

    interface MyInjector extends Ginjector {
       ... //other methods
    
      ActivityMapper  getActivityMapper();
    
    }
    

    Than , when you create ginjector instance, you can create a manager and put correct activity mapper into it. for example:

     MyInjector  injector = GWT.create(MyInjector.class);
       ActivityManager manager = new ActivityManager(injector.getActivityMapper(), injector.getEventBus());
    

    If you have multiple managers and mappers, may be it will be better to extend ActivityManager class (so you can inject stuff into its constructor). Another solution is to use @Provides to initialize ActivityManager.