Как правило, я хочу, чтобы правильно делился 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
.
Сильно нужен здесь какой-то совет, какой правильный путь!