При получении ViewModel во фрагменте я должен предоставить «viewModelStore» или «this» в качестве ViewModelStore для метода ViewModelProvider () - PullRequest
0 голосов
/ 10 марта 2020

Внутри моего фрагмента класса, когда я получаю свою viewModel, я могу написать свой код двумя разными способами.

  • Используя "viewModelStore"
ViewModelProvider(viewModelStore, viewModelFactory).get(FragmentViewModel::class.java)
  • Использование «this»
ViewModelProvider(this, viewModelFactory).get(FragmentViewModel::class.java)

Мой вопрос заключается в том, существует ли какая-либо разница между двумя альтернативами, и если да, то какой из них является предпочтительным?

1 Ответ

0 голосов
/ 10 марта 2020

Если вы предоставляете свой собственный ViewModelProvider.Factory, то нет никакой разницы, поэтому просто используйте то, что проще, this.

Конечно, если вы находитесь в Kotlin, вы не Вам вообще не нужно использовать ViewModelProvider, вместо этого вы бы хотели использовать Фрагмент KTX и использовать

val viewModel: FragmentViewModel by viewModels { viewModelFactory }

Обратите внимание, что если бы вы были , а не используя собственную фабрику, вы всегда должны передавать ViewModelStoreOwner (то есть this) вместо того, чтобы просто передавать ViewModelStore, поскольку Javado c явно упоминает:

Этот метод будет использовать фабрику по умолчанию , если владелец реализует HasDefaultViewModelProviderFactory. В противном случае будет использоваться ViewModelProvider.NewInstanceFactory.

Конструктор ViewModelStore не сможет получить правильную фабрику по умолчанию.

...