Должен ли я поделиться своей ViewModel между двумя фрагментами?
Я пытаюсь следовать рекомендациям Android и использовать последние рекомендованные компоненты архитектуры. Вы можете увидеть мои попытки здесь: https://github.com/randroid88/TodayILearned
Прямо сейчас возможности приложения очень ограничены.
- Он имеет комнату БД для локального хранения записей журнала.
- Один фрагмент, HomeFragment, в котором перечислены все записи
- Другой фрагмент, EntryEditorFragment, который создает новые записи.
- ViewModel, EntryViewModel, который обновляет данные через репозиторий.
Проблема в том, что только HomeFragment имеет доступ к EntryViewModel прямо сейчас.
Поэтому в моем текущем проекте я передаю новый текст записи из EntryEditorFragment в HomeFragment через набор аргументов (используя SafeArgs из нового компонента архитектуры навигации), затем HomeFragment создает новую запись через EntryViewModel:
val safeArgs = HomeFragmentArgs.fromBundle(arguments!!)
savePossibleNewEntry(safeArgs.entryText)
private fun savePossibleNewEntry(entryText: String) {
entryViewModel!!.insert(EntryCreator().create(entryText))
}
Это не правильно.
Было бы лучше, если бы EntryViewModel также имел доступ к EntryEditorFragment?
Чтобы выполнить это, должен ли я включить ViewModel в Activity, как описано здесь в этом блоге?
Какова лучшая практика здесь?
1 ответ
В документации Android предлагалось использовать ViewModel для "общего случая фрагментов основной детали", поэтому я решил сделать то же самое для моего случая.
Как и предполагалось, я применил ViewModel к Activity в обоих фрагментах:
entryViewModel = activity?.run {
ViewModelProviders.of(this, EntryViewModelFactory(this.application, EntryRepository(this.application))).get(EntryViewModel::class.java)
} ?: throw Exception("Invalid Activity")
Вот коммит, в котором я сделал изменение: https://github.com/randroid88/TodayILearned/commit/e307bd3f238e68a399a2a1619438770d908a606d