Реализация GWTP TabContainer для PresenterWidget

Я использую GWTP для приложения. В этом приложении мне часто нужно сделать PresenterWidget, который содержит вкладки с PresenterWidget на каждой вкладке.

Поскольку контейнер представляет собой PresenterWidget, я не могу использовать класс TabContainerPresenter, поэтому я делаю свою собственную реализацию.

Я столкнулся с некоторыми проблемами при попытке управлять жизненным циклом PresenterWidget, содержащегося на вкладках (onReveal(), onHide() и т. д.).

Первый вопрос. В данном конкретном случае рекомендуется вручную вызывать onReveal(), onHide() и т. д.?

2-й вопрос: я пытался управлять жизненным циклом, не вызывая эти методы.

Вот что я делаю: когда пользователь нажимает на вкладку, главный докладчик вызывает setInSlot(index,presenterWidget), чтобы поместить соответствующий PresenterWidget на правую вкладку.

Но: когда я нажимаю на вкладку, onReveal() вызывается для соответствующего PresenterWidget (хорошо!), а затем onReset() вызывается для всех PresenterWidget: почему все? Я ожидаю, что onReset() вызывается только для PresenterWidget, соответствующего активной вкладке.

=> Является ли setInSlot() правильным методом для вызова в этом случае?


person Arnaud Denoyelle    schedule 21.06.2013    source источник


Ответы (1)


Возможно, это может помочь: https://github.com/ArcBees/GWTP/wiki/Presenter-%22Slots%22

  1. Я бы не рекомендовал вызывать метод жизненного цикла вручную. Без них должно нормально работать.
  2. Вы хотите использовать метод setInSlot(), потому что в любой момент активен только один PresenterWidget.

Однако вы используете разные слоты для каждого PresenterWidget. Принцип работы setInSlot() заключается в том, что он заменяет любой PresenterWidget, назначенный этому слоту. Поскольку вы используете разные слоты для каждой вкладки, это не удалит другие PresenterWidgets. Другие PresenterWidget остаются в своих слотах, и, вероятно, именно поэтому на них вызывается onReset().
У вас есть 2 варианта:

  • Если вы хотите сохранить разные слоты, вы должны вызывать removeFromSlot для всех невидимых PresenterWidgets.
  • Укажите только один слот (TAB_CONTENT) и просто используйте setInSlot()
person Ümit    schedule 21.06.2013
comment
Я попробовал решение с одним слотом, поскольку я отображаю один виджет за раз. Это работает намного лучше, но все еще не идеально: теперь, если я нажимаю на вкладку, onHide() вызывается на предыдущей вкладке, onReveal(), затем onReset() вызывается только на новой вкладке. Проблема в том, что эти 2 метода всегда вызываются оба. Я ожидаю, что onReveal() будет вызываться только тогда, когда вкладка отображается в первый раз. Это правильно? Есть ли что-нибудь, что я могу сделать, чтобы иметь такое поведение? - person Arnaud Denoyelle; 21.06.2013
comment
Никакие onReveal() и onReset не вызываются вместе (см. github.com/ArcBees/GWTP/wiki/Presenter -Жизненный цикл). Вы можете использовать onBind(), чтобы делать что-то, когда создается Presenter, или вы используете флаг, чтобы узнать, первый ли это раз - person Ümit; 21.06.2013