Совместное использование ViewModel в родительском фрагменте с использованием компонента навигации - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь использовать один и тот же экземпляр ViewModel в родительском фрагменте и его дочерних элементах, используя компонент навигации. Иерархия выглядит следующим образом: Одиночное действие с навигацией. У этого хоста есть 3 дочерних фрагмента, A, B и C. В последнем фрагменте также есть навигация Хост с 2 фрагментами: X и Y. График ниже иллюстрирует иерархию.

Fragments hierarchy

Ожидается: я хотел бы поделиться тот же экземпляр фрагмента C ViewModel с фрагментами X и Y.

Current: ViewModel фрагмента C инициализируется дважды: один раз, когда инициализируется фрагмент C, и второй раз, когда инициализируется фрагмент X. Фрагмент X установлен как пункт назначения по умолчанию в фрагменте C nav graph. Когда я меняю место назначения по умолчанию на Y, ViewModel инициализируется в C и Y.

Что я уже пробовал: В дочерних моделях view я использую это:

        val viewModel: ParentViewModel =
        ViewModelProvider(findNavController().getViewModelStoreOwner(R.id.parent_graph)).get(
            ParentViewModel::class.java
        )

В родительском viewModel Я использую это:

    val viewModel by viewModels<ParentViewModel>()

Я также пытался внедрить viewModel, используя Koin sharedViewModel с областью фрагмента:

val viewModel by sharedViewModel<ParentViewModel>(from = { parentFragment!! })

Также не повезло.

Возможно или это ошибка в навигационной библиотеке?

1 Ответ

1 голос
/ 23 февраля 2020

A NavHostFragment - это сам фрагмент, поэтому ваша структура на самом деле

Fragment C -> NavHostFragment -> Fragment X
                              -> Fragment Y

Т.е. parentFragment, полученное из фрагмента X, равно , а не Фрагмент C - это NavHostFragment, которое вы добавили между двумя.

Поэтому, если вы хотите получить ViewModel из фрагмента C, вам нужно будет использовать requireParentFragment().requireParentFragment() - родительский элемент вашего NavHostFragment является фрагментом C.

...