Должен ли я поделиться своей 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