Сброс / очистка модели просмотра или живых данных

Я следую шаблону приложения одно-единственное действие , рекомендованному Google, поэтому, если я хочу обмениваться данными между Fragments, я должен предоставить общий доступ к ViewModel, владельцем которого должен быть родитель Activity. Итак, проблема заключается в том, что я хочу обмениваться данными только между двумя фрагментами, независимо от других.

Представьте, что у меня есть MainFragment, CreateItemFragment и ScanDetailFragment. Итак, с первого я перехожу к CreateItemFragment, в котором всякий раз, когда я нажимаю кнопку, я перехожу к ScanDetailFragment, чтобы сканировать штрих-код и, как следствие, через объект LiveData внутри ViewModel я могу вернуть отсканированное значение обратно в CreateItemFragment. после завершения ScandDetailFragment. Проблема возникает, когда я решаю отменить создание элемента: я возвращаюсь к `MainFragment 'и поскольку владельцем ViewModel был жизненный цикл Activity, как только я снова перехожу в CreateItemFragment, ранее отсканированное значение все еще там.

Есть идеи сбросить эту модель просмотра?

Всего 4 ответа


но разве модели просмотра также не предназначены для обмена данными между разными представлениями?

Нет. Каждая модель представления должна отвечать за одно представление. " общая модель просмотра " шаблон предназначен для случаев, когда у вас есть одно большое представление (т. е. действие), которое имеет несколько подвидов (т. е. фрагментов), которым необходимо делиться данными / состоянием, например the master / detail example in the documentation. Это удобно в тех случаях, когда вам нужны обновления в режиме реального времени среди подвидов.

В вашем случае вы перемещаетесь между фрагментами, и поэтому вы должны передавать данные через переходы. Это означает passing arguments along when starting new fragments и registering for results when they complete their task.

Тогда каждый из ваших фрагментов будет изолированным, самодостаточным, более легким для тестирования, и вы не получите в итоге модель God-ViewModel, которая выполняет All The Things ™ и превращается в гигантский беспорядок, когда вы пытаетесь перепрыгнуть через обручи учета для любого состояния, в котором он мог быть.


В таких случаях вы можете использовать обратные вызовы для обмена данными между фрагментами. или если вы используете DB / Sharedpreference / Content provider, вам не нужно беспокоиться о совместном использовании данных, каждая страница будет извлекать свои собственные данные из хранилища (DB / SharedPreference / Contentprovider).

вы также можете попробовать https://medium.com/@lucasnrb/advanced-viewmodels-part-iii-share-a-viewmodel-between-fragments-59c014a3646, если это руководство поможет


Вы можете сбрасывать значение LiveData каждый раз, когда входите в CreateItemFragment из MainFragment.

Или вы можете просто очистить его с помощью метода CreateItemFragment в onBackPressed().


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


Есть идеи?

10000