Shared viewModel достиг жизненного цикла фрагмента - PullRequest
0 голосов
/ 03 июля 2019

Как я могу использовать общий viewModel с фрагментами без активности?Как и в коде, но вместо requireActivity () используйте ParentFragment.В этом случае, когда ParentFragment будет уничтожен, SharedViewModel очищается, но когда я предоставляю SharedViewModel из действия, он не очищается, когда ParentFragment уничтожается.

И я использую компоненты навигации, что означает, что я не могу установить тег для фрагментаи затем используйте findFragmentByTag ()


class ParentFragment:Fragment{

    override fun onCreate(savedInstanceState: Bundle?) {
      var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
    }
}

class ChildFragment:Fragmnet{
   override fun onCreate(savedInstanceState: Bundle?) {
      var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
    }

}


Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Вы можете попробовать scoped-vm - он позволяет запрашивать ViewModel для scope , идентифицируемого ключом String. Scope живет до тех пор, пока последний фрагмент, который запрашивал ViewModel, не будет уничтожен, а затем ViewModel очищен.

Этот код можно использовать для получения SharedViewModel как в ParentFragment, так и в ChildFragment.

ScopedViewModelProviders
     .forScope(this, "scope")
     .of(requireActivity())
     .get(SharedViewModel::class.java)
0 голосов
/ 03 июля 2019

Смотрите, вы можете инициализировать viewModel во всех фрагментах, которыми вы хотите поделиться viewmodel, и использовать Rx с viewModel, ваш весь процесс в этих фрагментах будет продолжаться, пока вы не захотите его отменить, вы можете вызвать viewModel.oncleard () из Activity или фрагмент.

public override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
// or cancel any process
}

Если вы не знаете ViewModel Scope, проверьте это изображение

...