Класс ViewModel
предназначен для хранения и управления данными, относящимися к пользовательскому интерфейсу, с учетом жизненного цикла.
Если вы хотите поделиться какими-либо данными между вашими viewModels, лучше всего было бы создать источник данных singleton
и предоставить его внутри viewModels, например, SharedPreferences
, sqlite
datase,и т. д.
Если вам действительно нужно использовать viewModel в качестве источника данных, вы можете создать его экземпляр singletone
, реализовав пользовательский ViewModelFactory
, который уже обсуждался в этой проблеме github :
вы можете использовать фабрику для создания модели представления, и этот коэффициент будет возвращать отдельный объект модели представления. Как:
class ViewModelFactory() : ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
if (modelClass.isAssignableFrom(UserProfileViewModel::class.java)) {
val key = "UserProfileViewModel"
if(hashMapViewModel.containsKey(key)) {
return getViewModel(key) as T
} else {
addViewModel(key, UserProfileViewModel())
return getViewModel(key) as T
}
}
throw IllegalArgumentException("Unknown ViewModel class")
}
companion object {
val hashMapViewModel = HashMap<String, ViewModel>()
fun addViewModel(key: String, viewModel: ViewModel) {
hashMapViewModel.put(key, viewModel)
}
fun getViewModel(key: String): ViewModel? {
return hashMapViewModel[key]
}
}
}
В Activity:
viewModelFactory = Injection.provideViewModelFactory(this)
// Initialize Product View Model
userViewModel = ViewModelProviders.of(this,viewModelFactory).get(UserProfileViewModel::class.java)
Это обеспечит только один объект UserProfileViewModel, который вы можете разделить между действиями.