Я давно использую MVP и начинаю переходить в гибридное состояние между MVP и MVVM
Подробно мои приложения будут выглядеть так:
- Каждое действие имеет от 0 до x фрагментов, которые представляют его представления.
- Каждый фрагмент будет запрашивать ViewModel действия, чтобы они могли извлекать данные с помощью LiveData.
- У Activity будет отдельная ViewModel, которая будет выступать в качестве докладчика. При создании в эту ViewModel будет добавлен ViewModel Activity с LiveData, чтобы он мог обновлять пользовательский интерфейс по мере необходимости.
- Докладчик получит сообщения, отправленные в модель ViewModel данных, и отправит ей результаты.
Мои вопросы:
- Может ли сохранение ссылки на ViewModel данных в ViewModel презентатора вызвать утечку памяти или побочные эффекты, такие как утечки памяти?
- Где должна быть бизнес-логика? в ведущей или в модельной части?
Например, предположим, что у меня есть список элементов, и пользователь долго нажимает один, чтобы отредактировать их, какая часть этой архитектуры должна отвечать за проверку того, есть ли у пользователя разрешение на это, и либо позволить ему редактировать элемент, либо показать ошибку сообщение?
- Есть ли способ для фрагментов получить только часть ViewModel Activity?
Например, предположим, что под действием есть 3 фрагмента и одна ViewModel для их обслуживания.
Могу я использовать что-то вроде:
class MainViewModel : ViewModel() , IFragmentA, IFragmentB, IFragmentC
а затем, когда я пытаюсь получить ViewModel по фрагментам, я могу написать что-то вроде:
lateinit var viewModel: IFragmentA
override fun onAttach(context: Context?) {
super.onAttach(context)
vm = ViewModelProviders.of(context as AppCompatActivity).get(IFragmentA::class.java)
}
примечание: я знаю, что приведенный выше код не работает, я спрашиваю, есть ли способ, чтобы что-то подобное могло сработать
- Правильный ли способ отправки сообщений активности SingleEvents?
Например, если пользователь пытается удалить запись, а я хочу, чтобы он ввел пароль, поток будет следующим:
- Фрагмент отправляет сообщение для удаления своей ViewModel.
- ViewModel передает его докладчику.
- Ведущий решает, что ему необходимо проверить пароль, прежде чем продолжить
- Ведущий устанавливает значение SingleEvent в ViewModel.
- ViewModel уведомляет подписчиков события (в данном случае MainActivity), что они должны показать диалоговое окно с запросом пароля.
Спасибо за любую помощь, которую вы можете предоставить