Должен ли я поделиться своей ViewModel между двумя фрагментами? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь следовать рекомендациям 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 Ответ

0 голосов
/ 01 января 2019

В документации для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...