Делить ViewModels между фрагментами ИЛИ делиться LiveData между ViewModels - PullRequest
0 голосов
/ 22 марта 2020

Как правило, я хочу, чтобы правильно делился ViewModels между фрагментами ИЛИ делился LiveData между ViewModels.

Мой сценарий:

У меня есть 2 фрагменты (FragmentA & FragmentB) - у каждого есть свои ViewModels:

FragmentA имеет ViewModelA, FragmentB имеет ViewModelB.

ViewModelA имеет LiveDataA1, ViewModelB имеет LiveDataB1 и LiveDataB2

ViewModelB разрешено иметь только LiveDataB2, а ViewModelA не может иметь его.

Проблема я хочу FragmentA наблюдать LiveDataB2 от ViewModelB.

Подход № 1:

Помимо ViewModelA, ViewModelB есть также может использоваться в FragmentA (так что это похоже на 2 ViewModels во FragmentA). Так что FragmentA будет наблюдать LiveDataB2 от ViewModelB.

Это моя текущая реализация сейчас. Но я чувствую, что неправильно использовать другую ViewModel, предназначенную для других фрагментов. Я думаю, что каждый фрагмент должен иметь только 1 ViewModel.

Подход № 2:

Создать новый SharedViewModel. Теперь у нас будет 3 ViewModels: ViewModelA имеет LiveDataA1, ViewModelB имеет LiveDataB1, SharedViewModel имеет LiveDataB2. (Здесь я перемещаю LiveDataB2 с ViewModelB на SharedViewModel)

Помимо ViewModelA, SharedViewModel также используется в FragmentA. Таким образом, FragmentA будет наблюдать LiveDataB2 из SharedViewModel.

Так что я думаю, это то же самое, что и # 1, но я думаю, но здесь я думаю, что SharedViewModel - это просто утилита ViewModel, чтобы получить нужны общие данные. Итак, здесь мы словно помещаем все LiveDatas, которые могут быть общими / общими для FragmentA и FragmentB (или даже для других фрагментов)

Подход № 3:

Поделиться LiveData между ViewModels. Я думаю, что это дико, и я не знаю, как это реализовать. Но я думаю, что появится новый LiveDataA2 в ViewModelA, который ссылается на тот же экземпляр , что и LiveDataB2 в ViewModelB.

Таким образом, FragmentA будет иметь только ViewModelA и может наблюдать LiveDataA2. Если есть изменение в LiveDataB2 в ViewModelB, оно будет у FragmentA.

Сильно нужен здесь какой-то совет, какой правильный путь!

1 Ответ

0 голосов
/ 23 марта 2020

Shared ViewModel - правильный подход

Вы должны использовать один Shared ViewModel для обоих фрагментов FragmentA и FragmentB с несколькими объектами активных данных LiveDataA1, LiveDataB1 и LiveDataB2, с этим подходом ваш FragmentA может легко наблюдать LiveDataB2.

Теперь, проблема с вашими подходами:

Подход № 1:

Если FragmentA создает экземпляр ViewModelB, вы не получите ViewModelB ассоциации с FragmentB, поэтому ViewModelB потерял свое состояние.

Подход № 2:

Почему-то проблема в том, что вы создаете отдельный ViewModel, когда есть рекомендуемый способ, то есть Shared ViewModel согласно официальным документам

Подход № 3:

Совместное использование LiveData объектов - неправильный подход, поскольку он связан с владельцем жизненного цикла.

...