Как передать один и тот же экземпляр ViewModel фрагменту Parent и Child - PullRequest
0 голосов
/ 26 мая 2018

Есть два фрагмента: ParentFragment и ChildFragment.ChildFragment было добавлено к представлению ParentFragment.

Теперь использование Dagger2 для Android имеет ParentFragmentModule с методом:

@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}

Где MyViewModelFactory, MyViewModelMyViewModelImpl - это простая логика ViewModel, созданная в приложении.

И у ChildFragmentModule есть метод:

@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}

Это, очевидно, создает два отдельных экземпляра ViewModel, поскольку они получают два разныхэкземпляры фрагмента.

Как сделать так, чтобы он возвращал один и тот же экземпляр, чтобы данные могли быть разделены между фрагментами Parent и Child?

Я попытался передать ParentFragment вместо ChildFragment в ChildFragmentModule, но это приводит к ошибке внедрения зависимости от кинжала.

1 Ответ

0 голосов
/ 26 мая 2018

Создайте ViewModel с Activity областью действия.Тогда все Fragment в этом Activity получат один и тот же ViewModel экземпляр.

Проверьте официальную ссылку ViewModelProviders .Вы можете создать ViewModel с областью действия Activity и Fragment.

ViewModelProvider of (FragmentActivity activity)

Создает ViewModelProvider, который сохраняет ViewModels, пока область действия данного Activity активна.Более подробное объяснение есть во ViewModel.

и

ViewModelProvider of (Fragment fragment)

Создает ViewModelProvider, который сохраняет ViewModels, пока область данного фрагмента жива.Более подробное объяснение есть во ViewModel.

Пример кода для создания ViewModel

Из действия:

 movieListViewModel = ViewModelProviders.of(this).get(MovieListViewModel.class);

Из фрагмента:

 movieListViewModel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
...