Я читал о шаблоне MVVM. View должен наблюдать за изменениями в ViewModel и действовать в соответствии с этим, но я не понимаю, подходит ли следующий код в View в архитектуре MVVM.
fun onClick(view:View){
showUser(viewModel.getUserDisplayName())
}
Здесь View не наблюдает за изменениями, он скорее запрашивает последние данные от ViewModel. Считается ли это правильным в MVVM?
Этот вопрос к MVP. В MVP презентатор содержит ссылку на представление, поэтому он может вызывать методы в представлении, тогда как в MVVM ViewModel не имеет представления о представлении. @SirCodesalot
Извините, не заметил. Насколько мне известно, в MVVM код должен быть чем-то вроде viewModel.showUserClicked(), а ViewModel должен обрабатывать логику, стоящую за ним.
Лучше использовать привязку данных, чтобы привязать щелчок непосредственно к вашей модели просмотра, например android:onClick = "@{() -> viewmodel.showUserClicked()}"
Это вопрос, на который, возможно, нет однозначного ответа, поскольку в зависимости от конкретного варианта использования могут быть высказаны разные моменты. Тем не мение:
Сэр Кодесалот (отличная ручка), на мой взгляд, технически верен. Позвольте мне уточнить.
В MVVM представление должно передавать события (команды) взаимодействия с пользовательским интерфейсом в ViewModel. Вот статья от Microsoft (кто изобрел mvvm): https://msdn.microsoft.com/en-us/library/ff798384.aspx Примеры здесь не относятся к android, но концепции должны быть такими же, особенно если вы посмотрите на первую диаграмму.
ViewModel должен творить чудеса, реагировать на эти события, соответствующим образом манипулируя данными, а затем уведомлять наблюдателей (обычно представление) об изменениях состояния. Затем представление реагирует на изменения состояния.
Таким образом, если вы просто передадите данные обратно из ViewModel (синхронным способом), тогда в вашем представлении могут отсутствовать побочные эффекты. В вашем конкретном примере их, вероятно, нет, но учтите, что вызываемый вами метод не только возвращает данные, но также изменяет некоторое внутреннее состояние (например, подсчитывает количество обращений к данным). Тогда ваша точка зрения не узнает об этом.
Конечно, вы можете утверждать, что вы можете вернуть все соответствующие данные для представления, но это начинает нарушать принцип единой ответственности.
Вот интересная запись в блоге, которая может дать лучший пример того, почему представление всегда должно получать состояние после ViewModel: https://medium.com/upday-devs/mvvm-rxjava-learnings-1819423f9592
Что касается другого случая, статья в Википедии о MVVM https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel утверждает, что ViewModel может предоставлять общедоступные свойства.
Так что в конце концов, скорее всего, будет чище, если вы не вернете данные напрямую. Однако вы являетесь архитектором и знаете свое приложение лучше всех, и могут быть случаи, когда шаблоны могут быть нарушены. В конце концов, они руководящие принципы. Если вы знаете, почему вы его ломаете (и, возможно, документируете это), то все должно получиться.
Смотрите ответ здесь stackoverflow.com/questions/38360478/…