169 похожих чатов

Я пытаюсь поставить приложение на MVVM рельсы, но немного не

понимаю некоторых принципов, как оно должно работать:
Как сделать, чтобы несколько 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, мне следует инициализировать модели, чтобы они замыкали эту сложную цепочку вызовов между двумя вьюшками?

4 ответов

13 просмотров

View в случае с mvvm может послужить фрагмент, к которому ты привяжешь вёрстку в которой и будут твои вьюхи. Попробуй оставить активити как контейнер и создать Fragment with viewModel, много моментов упростится, если я правильно тебя понял

Илья- Автор вопроса
Алексей Бряков
View в случае с mvvm может послужить фрагмент, к к...

Типо чисто в Activity onCreate создавать все модельки и передавать их в какие надо фрагменты?

Илья
Типо чисто в Activity onCreate создавать все модел...

типо того, просто создаешь контейнер, и при вызове активити сеттишь в него фрагмент тут с навигацией придется поразбираться, смотря что юзаешь

Илья
Типо чисто в Activity onCreate создавать все модел...

Моделька внедряется в вьюмодель через di

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта