Как применить MVP к вложенным фрагментам Android?

Я занимаюсь рефакторингом компонента Android, чтобы принять архитектурный шаблон MVP. Проблема, с которой я столкнулся, заключается в том, что у меня есть фрагмент, в который вложены другие фрагменты.

1- Родительский фрагмент скрывает / показывает один из вложенных фрагментов в зависимости от некоторых условий.

2- Дочерний фрагмент передает данные родительскому фрагменту, который наблюдает за ним как здесь, вдохновленный механизм обратного вызова между фрагментом и действием.

У меня 2 вопроса:

1. Если я рассматриваю фрагмент как представление MVP, следует ли мне использовать отдельных презентаторов для родительского и дочернего фрагментов (сопоставление 1 к 1 между презентаторами и представлениями) или только одного презентатора для обоих и почему?

2- Если я должен использовать разных презентаторов, как мне обрабатывать передачу данных из дочернего фрагмента в родительский фрагмент, поскольку я почти не знаю минусов. и плюсы. из:

  • Использование фреймворка EventBus, такого как Otto
  • Разрешить докладчику иметь прямую ссылку на другого докладчика
  • Держите связь на уровне представления, вдали от докладчиков, как здесь, за счет того, что делегаты вложенного представления вызывают вызовы, которые он получает от своих ведущий к родительскому представлению.

person Islam Salah    schedule 20.06.2018    source источник
comment
Я думаю, что лучше разделить эти вложенные фрагменты, я не видел вложенных фрагментов в качестве лучшей практики. Поместите каждый фрагмент в отдельный файл.   -  person salmanseifian    schedule 20.06.2018


Ответы (2)


Как и в случае с большинством вопросов по архитектуре, я честно считаю, что нет правильного или неправильного пути. Поэтому, пожалуйста, относитесь к этому просто как к предложению (как я бы это реализовал)

Каждый блок MVP должен содержать своего собственного презентатора, что означает, что существует один родительский презентатор (для родительского фрагмента). и несколько дочерних презентаторов (по одному на каждый дочерний фрагмент).

Все дочерние презентаторы содержат поле parentPresenter, которое действует как способ передачи данных / сообщений от дочернего к родительскому < / сильный>. Этот parentPresenter НЕ является настоящим объектом presenter, а является интерфейсом, который включает только необходимые вызовы.

Если вам нужно передать данные / сообщения наоборот (от родителя к дочерним элементам), это реализуется с помощью методов интерфейса в просмотр:

  • parentPresenter вызывает свое представление
  • parentView находит это childFragment
  • childFragment вызывает соответствующий вызов интерфейса для childPresenter

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

person Bmuig    schedule 20.06.2018
comment
Я высоко ценю: - вашу точку зрения на решение вопросов архитектуры. - ваш очень организованный ответ, что почти никому не нужно читать его дважды, чтобы понять вашу точку зрения. Я согласен с тем, чтобы для каждого представления был отдельный докладчик. Что касается второго пункта, не могли бы вы объяснить, в чем разница между применением механизма обратного вызова между представлениями и его применением между докладчиками? Также будет высоко оценен любой образец Android, подтверждающий ваш ответ. - person Islam Salah; 20.06.2018
comment
например, образцы: приложение Todo - Bourbon - Mindorks - person Islam Salah; 20.06.2018

В своем приложении я использую механизм обратного вызова между родительским и дочерним фрагментами для передачи данных между ними. Я также сделал разных презентаторов для каждого дочернего фрагмента, потому что, если бы однажды я хотел использовать только один из дочерних фрагментов, я бы только переопределил его методы презентатора.

person Zach Bublil    schedule 20.06.2018