Как правильно настроить GWT Activity и ActivityMapper?

У меня есть следующие классы:

// The "backing bean" for DashboardDisplay.ui.xml (which is omitted for brevity).
public class DashboardDisplay extends Composite implements AcceptsOneWidget {
    private EventBus eventBus;
    private PlaceController placeController;
    private IsWidget content = null;

    public DashboardDisplay(EventBus eventBus, PlaceController placeController) {
        super();

        setEventBus(eventBus);
        setPlaceController(placeController);
    }

    // Getters and setters for all properties
    // ...

    @Override
    public void setWidget(IsWidget widget) {
        setContent(widget);
    }
}

public class DashboardActivity extends AbstractActivity {
    private AcceptsOneWidget container;
    private ActivityManager manager;
    private DashboardDisplay display;

    public DashboardActivity(AcceptsOneWidget container, ActivityManager manager,
        DashboardDisplay display) {
        super();

        setContainer(container);
        setManager(manager);
        setDisplay(display);

        // I *believe* this ensures that the 'panel' passed in to the
        // start method is always our 'container'. Yes?
        manager.setDisplay(container);
    }

    // Getters and setters for all properties
    // ...

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus) {
        display.setEventBus(eventBus);
        panel.setWidget(display);
    }
}

public class DashboardActivityMapper implements ActivityMapper {
    private DashboardActivity activity = null;

    // Getters and setter for activity.

    @Override
    public Activity getActivity(Place place) {
        // Leaving arguments null because I'm confused about the object graph
        // (read below).
        return new DashboardActivity(null, null, null);
    }
}

Итак, я начинаю иметь какое-то подобие понимания структуры Activity, но все еще настолько плохо знаком с ней, что, когда я пытаюсь отвлечься от примеров Hello, GWT , я почти мгновенно сталкиваюсь с препятствиями в API.

В основном модуле GWT моего приложения, MyWebAppModule, я пытаюсь создать и настроить эти 3 объекта. Но поскольку я все еще не уверен, как использовать их API, у меня возникают проблемы с реализацией:

public class MyWebAppModule implements EntryPoint {
    @Override
    public void onModuleLoad() {
        // I'll worry about DI and getting GIN to work after
        // I figure this basic stuff out.
        EventBus eventBus = new SimpleEventBus();
        PlaceController placeController = new PlaceController(eventBus);
        MyWebAppPlaceHistoryMapper placeMapper = new MyWebAppPlaceHistoryMapper();
        HomePlace homePlace = new HomePlace();

        // WHERE THE PROBLEM STARTS
        DashboardActivityMapper activityMapper = new DashboardActivityMapper();
        ActivityManager manager = new ActivityManager(activityMapper, eventBus);

        // Really not sure how to inject/configure this properly.
        DashboardActivity dashboardActivity = new DashboardActivity(null, null, null);
        // WHERE THE PROBLEM ENDS

        PlaceHistoryHandler historian = new PlaceHistoryHandler(placeMapper);
        historian.register(placeController, eventBus, homePlace);
        historian.handleCurrentHistory();
    }
}
  1. Ясно, что я неправильно реализовал DashboardActivityMapper и DashboardActivity, поэтому это вызывает проблемы, когда я пытаюсь создать и связать их экземпляры внутри MyWebAppModule#onModuleLoad. Может ли кто-нибудь помочь мне реализовать это правильно? Как только я получу рабочий пример, я уверен, что смогу соединить остальные «точки» в структуре Activity.
  2. Если я что-то не упустил, ActivityManager manager выше, похоже, не добавляется ни к какому другому классу. Это правильно? Будет ли GWT гарантировать, что он останется в памяти, чтобы он всегда прослушивал eventBus я передаю его для PlaceChangeEvents? Или мне нужно что-то добавить/зарегистрировать?

Заранее спасибо!


person Community    schedule 08.11.2012    source источник


Ответы (1)


  1. Ваш DashboardActivityMapper отвечает за создание и возврат DashboardActivity при достижении заданного места (например, HomePlace). Вам не хватает этой информации?
    См. https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces#ActivityMapper

  2. Пока EventBus имеет дескриптор ActivityManager (чтобы он мог отправлять ему события). Однако ActivityManager регистрирует себя в EventBus в своем методе setDisplay при вызове с ненулевым значением (и отменяет регистрацию, когда null передается в setDisplay), и вы не вызываете setDisplay (что, кстати, означает, что действия даже не отображается)

person Thomas Broyer    schedule 08.11.2012
comment
Спасибо @Thomas Broyer (+1) - теперь я понимаю, в чем причина моего замешательства. Я действительно понимаю следующее: DashboardActivityMapper отвечает за создание и возврат DashboardActivity. Затем ActivityManager получает DashboardActivityMapper, и когда он получает HomePlace от зарегистрированного EventBus, он знает, что нужно вызвать метод start DashboardActivity... - person ; 08.11.2012
comment
(продолжение)... Если да, то вот корень моей проблемы: Когда ActivityManager вызывает getActivity(homePlace) и возвращает DashboardActivity, что происходит с DashboardActivity? Как это связано с вызовом DashboardActivity#start(AcceptsOneWidget,EventBus)?. Еще раз спасибо! - person ; 08.11.2012
comment
ActivityManager вызовет метод start действия, передав значение, которое вы передали его setDisplay - person Thomas Broyer; 08.11.2012