SharedViewModel между областью фрагмента - PullRequest
0 голосов
/ 31 марта 2020

Теперь у меня есть два фрагмента, которые должны совместно использовать viemodel

class FragmentA(): Fragment() {
  val sharedViewModel = ViewModelProvider.(need_a_shared_context)....//not the activity context
}

class FragmentB(): Fragment() {
val sharedViewModel = ViewModelProvider.(need_a_shared_context).... //not the activity context
}

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

Итак, если я присоединяю view-модель к жизненному циклу активности, я могу обмениваться данными между этими двумя, но он также будет прослушивать данные, когда я Я не в FragmentA() или FragmentB()

Есть ли способ создать эту модель общего доступа, когда я только в FragmentA () или FragmentB ()?

Редактировать

Поскольку я использую NavigationComponents, при переходе от FragmentA() к FragmentB() фрагмент A умирает, поэтому, если я создам там свою совместно используемую модель, она будет d ie, когда я получу доступ к FragmentB() и FragmentB() создаст новый экземпляр модели представления.

1 Ответ

1 голос
/ 01 апреля 2020

Вопрос слишком широкий.

Почему вы не хотите, чтобы действие размещало модель представления? Если вы не хотите, чтобы ваши слушатели были уведомлены, когда на самом деле не отображается пользовательский интерфейс, вы можете удалить его [слушатели]. Я не знаю точно о базе данных реального времени (уверен, что она имеет те же функции), но addSnapshotListener методы Firestore возвращают ListenerRegistration объект, который имеет remove() метод для удаления слушателя, поэтому вы не будете уведомлены об обновлениях документа и таким образом, плата за него не взимается.

Вы можете разместить ViewModel в любом компоненте, который захотите, но я бы даже подумал использовать для него Object, поэтому каждый экземпляр вашего ViewModel получает один и тот же синглтон, который хранит кэшированное значение и предоставляет его в виде LiveData вашим наблюдателям, но фактически запускает и останавливает наблюдение за узлом Firebase (и обновляет LiveData наблюдения ваших фрагментов) только после того, как будут вызваны c методы - onStartObserving() / onStopObserving, который можно вызвать из ваших фрагментов 'onStart() & onStop()

...