Зоны ответственности View и ViewModel. Android+Kotlin
Начинаю осваивать MVVM, есть вопросы. Никак не могу прочно усвоить зоны ответственности View и ViewModel.
Согласно паттерну MVVM в моем проекте "модель"-репозиторий - класс некоторого устройства, объединяющего в себе несколько однотипных модулей (аппаратных устройств), т.е. объектов одного типа (класса). Каждый модуль имеет свои параметры. Модули различаются адресом (идентификатором). Теоретически заранее неизвестно сколько модулей подключено к устройству. Задача - реализовать процедуру настройки каждого отдельного модуля. Очевидно, что настроечный экран (Fragment) на каждый отдельный модуль делать бессмысленно. Как реализовать идентификацию модуля из фрагмента и как правильно обеспечить доступ к параметрам модуля?
В данный момент мысли таковы: При переключении во фрагмент настроек я знаю какой модуль буду настраивать. Т.е. при создании фрагмента могу адрес передать во фрагмент через Bundle.
В листенере ввода параметра (внутри фрагмента) получаю ссылку на конкретный модуль и далее нужный параметр устанавливаю в соответствии с введенным числом в окне ввода.
viewModel.getModule(addr)?.parameter = ....
Насколько такой подход противоречит паттерну MVVM? Меня смущает почти прямой доступ к полю класса репозитория изнутри View.
Уточнение по сохранению параметра модуля:
(viewModel.getModuleByAddr(0x02) as PowerUnit).controlFolder.relay1 = 1
Здесь 0x02 - адрес модуля, PowerUnit - класс модуля (на самом деле там разнотипные модули, наследованные от общего предка). Так вот, беспокоит необходимость импорта класса PowerUnit внутри фрагмента. По-моему, это неправильно.
Ответы (1 шт):
В общем, почитав ликбезы, решил что это неправильный подход. Во View все должно быть "тупо", без лишних алгоритмов и типов данных. Получается, я пытался работать из View с объектами репозитория почти в обход viewModel.
Сейчас решил сделать иначе: все параметры теперь обернуты классом:
data class Param<T> (
val idTag: String,
val parValue: T,
val updateEnable: Boolean = true
)
Соответственно идентификация параметра из View - через idTag, что-то вроде этого: viewModel.setModuleParameter(moduleAddr = 0x02, "relay1", parameterValue = 1)
Соответственно, параметр устанавливается по правильной цепочке View->ViewModel->Device->Module->Param. Громоздко, конечно, в плане поиска нужного параметра по тегу, но зато никаких лишних импортов в View.