понимаю некоторых принципов, как оно должно работать:
Как сделать, чтобы несколько ViewModel взаимодействовали с одной и той же моделью, если в MVVM не стоит делать, чтобы View знала что-либо о моделях?
Скажем, у меня есть два View. Один — buttonView, второй — textView. Пусть нужно, чтобы при нажатии на кнопку, что-то менялось в тексте.
Я предполагаю, что данные должны перетекать как-то так:
у кнопки и текста непосредственно логики нет. Кнопка вызывает у ButtonViewModel метод onClick() при нажатии, а textView наблюдает за текстом LiveData в TextViewModel. В обоих ViewModels нет бизнес логики, просто одной из вьюх предоставляется событие щелчка button, а другая обсёрвит обновление текста. ButtonViewModel оповещает модель о нажатии, какой-нибудь ClickHandler, там в модели происходят какие-то обработки, и в конечном итоге уже другая ViewModel обсёрвит обновление текста в модели.
https://i.stack.imgur.com/t0l4h.png
Но тогда я не понимаю как устроены эти связи. Если я инициализирую модель ClickHandler в ButtonViewModel, значит TextViewModel не будет знать о модели и обсёрвить будет нечего. Я тогда рассуждаю, мол мне нужно инициализировать модель вне ViewModel-ей и просто предоставить им модель, например в конструкторе. Что-то вроде этого:
fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val clickHandler = ClickHandler()
textViewModel = ViewModelProvider(this,ViewModelFactory(clickHandler)).get(TextViewModel::class.java)
buttonViewModel = ViewModelProvider(this,ButtonModelFactory(clickHandler)).get(ButtonViewModel::class.java)
}
}
Но, на сколько я почитал про MVVM, инициализация модели ClickHandler в Activity противоречит паттерну - вью не должно знать о моделях.
Я пытался у GPT спросить решение, но лишь сильнее запутался :) . Одним из наиболее убедительных решений были фреймворки dependency injection, но я пока с ними не работал, вряд ли ведь все "трушные" MVVM решения включают сторонние фреймворки
Итоговый вопрос: как и где, используя шаблон MVVM, мне следует инициализировать модели, чтобы они замыкали эту сложную цепочку вызовов между двумя вьюшками?
View в случае с mvvm может послужить фрагмент, к которому ты привяжешь вёрстку в которой и будут твои вьюхи. Попробуй оставить активити как контейнер и создать Fragment with viewModel, много моментов упростится, если я правильно тебя понял
Типо чисто в Activity onCreate создавать все модельки и передавать их в какие надо фрагменты?
типо того, просто создаешь контейнер, и при вызове активити сеттишь в него фрагмент тут с навигацией придется поразбираться, смотря что юзаешь
Моделька внедряется в вьюмодель через di
Обсуждают сегодня