Общая модель просмотра между фрагментами без привязки к активности?

Используя новый компонент архитектуры навигации, у меня есть одно действие в качестве навигационного хоста с несколькими фрагментами для моих экранов. Прямо сейчас у меня есть EditProfileFragment, где пользователь может нажать кнопку, и откроется другой фрагмент со списком стран на выбор. Допустим, я хочу поделиться результатом выбора страны с EditProfileFragment. Общая идея заключается в том, что у меня будет одна модель EditProfileViewModel для всех действий «редактировать профиль».

  1. Как разделить выбранную страну между этими фрагментами? Я думаю об использовании общей модели представления, но я не решаюсь ограничить ее активностью, потому что не хочу, чтобы она сохранялась, когда пользователь завершает процесс «редактирования профиля».

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


comment
не могли бы вы просто очистить его, как только он будет завершен? или передать флаг при создании нового фрагмента, чтобы начать заново и игнорировать любые устаревшие/переходные данные?   -  person Mateo    schedule 20.11.2018
comment
@Матео Да, я мог бы. Мне просто интересно, есть ли более чистое решение   -  person papageorgiouk    schedule 20.11.2018
comment
@papageorgiouk Вы нашли хорошее решение этой проблемы? Я сталкиваюсь с точно такой же ситуацией, с фрагментом селектора страны :)   -  person datiKaa    schedule 11.12.2018
comment
@DaTi Я выбрал шаблон репозитория и объект для временного хранения общего состояния. Между ViewModel и View(контроллером) должна быть связь 1-к-1, поэтому я думаю, что это лучший подход.   -  person papageorgiouk    schedule 12.12.2018


Ответы (2)


С моделью общего представления действительно проще, но, как вы сказали, это связано с другими проблемами, такими как определение области действия модели представления в более высоком контексте для простого обмена информацией.

Модель общего представления IMHO - неплохой подход в определенных сценариях. Я работал над приложением с 5 вкладками, первая вкладка была похожа на сводку 2-й и 3-й. Это был хороший выбор для использования модели с общим представлением, так как я просто повторно использовал данные, просто изменив количество элементов, отображаемых адаптером в соответствующих представлениях, повторно использовалась логика.

Похоже, у вас есть общая логика/элементы в вашем профиле и на странице редактирования профиля. Я не знаю, сколько, но если вы чувствуете, что недостаточно разделить модель представления между этими двумя, помните, что только то, что вы используете модели представления, не означает, что вы должны использовать их для совместного использования/хранения/передачи некоторых данные. Например :

  • Перейти к предыдущему фрагменту с полученными данными.
  • Вы можете сохранить «профиль» для сохранения и изменить то, что хранится. Когда ваша модель просмотра для профиля (повторно) создается, она получает последнее значение из постоянства.
  • Вы можете обновить свой профиль напрямую на сервере и снова получить его в профиле.
  • Вы можете смешать эти два выше.
person Mel    schedule 26.11.2018
comment
К сожалению, настойчивость не вариант. - person papageorgiouk; 27.11.2018
comment
У вас есть какой-нибудь ДИ? Вы можете ограничить модель профиля активностью, чтобы фрагменты получали один и тот же экземпляр. - person Mel; 28.11.2018
comment
Определение области действия не является проблемой. Но мое приложение является одноактивным (с новым компонентом навигации), поэтому я бы предпочел не ограничивать его этой активностью (что, по сути, означает, что оно будет привязано к приложению) - person papageorgiouk; 29.11.2018
comment
Извините, я думаю, что модель немного сбивает с толку в этом контексте, я имел в виду сущность профиля, а не модель представления. - person Mel; 29.11.2018

Отвечая на мой собственный вопрос о том, как я решил это для дальнейшего использования:

Поскольку я хотел сохранить связь 1-к-1 между ViewModel-View(controller)/Fragment, я выбрал UserRepository, который содержит объект "временного состояния" для подобных случаев.

person papageorgiouk    schedule 12.12.2018
comment
Спасибо, что поделились этим. Можете ли вы предоставить больше информации о вашем UserRepository? Какой у него размах? Когда вы его создаете и как вам удается очистить временное состояние? - person konata; 14.12.2018
comment
@konata с областью действия приложения и позволяет Dagger инициализировать его в любое время. Временное состояние — это внутренний объект класса, реализующий шаблон построителя, который удаляется вручную, когда мы закончим с ним. - person papageorgiouk; 18.12.2018