MVP и не пользовательское взаимодействие

У меня есть приложение, разработанное с использованием шаблона MVP. Но иногда я не уверен, что все наши реализации придерживаются лучших практик MVP. Хотя не всегда возможно работать с книгой, я пытаюсь понять, где должна быть логика, которая имеет дело с не пользовательскими взаимодействиями.

Например:

Я должен обнаружить смещение вертикальной прокрутки RecyclerView. Когда прокрутка достигает 20% от высоты содержимого (примерно), я должен показать всплывающее окно. Теперь моя логика будет (псевдокод)

1. Presenter sets View.setVerticalOffsetTriggeringLimit(1000 pixels)
2. View triggers view event and call Presenter.offsetForPopUpReached()
3. Presenter triggers View.showPopUp()
4. pop up is shown

Плюсы и минусы? Есть ли способ сделать это лучше, пока еще есть тестируемый код? Является ли сама система "пользователем", который должен использовать презентатор в качестве среднего уровня?

1 ответ

Вся логика пользовательского интерфейса принадлежит View. В Presenter должна быть только логика взаимодействия между Model и View. Дело в том, что View может отличаться - это может быть либо пользовательский интерфейс, либо какой-то модуль, отправляющий команды через сокеты. Дело в том, что в обоих случаях "логика представления" - поскольку View взаимодействует с данными, остается одной и той же, поэтому ее необходимо перенести в Presenter. Всплывающие окна, поля и т. Д. - это представление деталей реализации. Удобная практика - создайте Presenter как синглтон и вставьте его с помощью DI в Activity, которая, в свою очередь, реализует View и подключает его к этому View. Вы можете избавиться от Модели, отправив события из Presenter через EventBus (липкие события). Если вы это сделаете, событие будет ждать, пока активность не получит его (метигитировать жизненный цикл активности). Я столкнулся с таким подходом совсем недавно.

Другие вопросы по тегам