Je suis nouveau dans le modèle mvvm. J'ai créé un ViewModel pour l'activité principale. Maintenant, je veux obtenir une instance du ViewModel dans l'activité principale.
La plupart des tutoriels et des réponses ici sur Stackoverflow suggèrent d'utiliser ViewModelProviders.of(...
, Mais ceci est obsolète.
Donc, selon cette question sur stackoverflow: ViewModelProviders est obsolète dans 1.1. activité principale dans onCreate, je fais ce qui suit (et je pourrais jurer que je l'avais déjà en cours d'exécution): mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Cependant, j'obtiens une erreur m'indiquant qu'aucun constructeur approprié n'a été trouvé.
error: no suitable constructor found for ViewModelProvider(MainActivity)
Alternativement, pour être absolument clair, que MainActivity sera le ViewModelStoreOwner, j'ai créé une variable ViewModelStoreOwner vmso = this;
Et mis cette variable dans le constructeur comme ceci: mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);
Pour l'instant, la seule chose qui fonctionnait pour moi était d'utiliser: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);
Cependant, je suis toujours reconnaissant pour tout conseil, comment cela peut être fait différemment en utilisant new ViewModelProvider(this).get(MainActivityViewModel.class);
Dupliquer la question et déjà répondu ici
Remplacez simplement:
Ce:
boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.Java)
Avec ça:
boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.Java)
Vous pouvez utiliser un ViewModelFactory
:
val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.Java)
Code VMFactory:
class VMFactory(application: Application) : ViewModelProvider.NewInstanceFactory() {
val _application: Application=application
@NonNull
override fun <T : ViewModel?> create(@NonNull modelClass: Class<T>): T {
return MainViewModel(_application) as T
}
}
Veuillez noter qu'ici mon MainViewModel
étend AndroidViewModel
et nécessite donc une application comme paramètre d'entrée.
ViewModel viewModel = ViewModelProviders.of (this) .get (ViewModel.class);
La version de la bibliothèque de support Android est dépréciée. Vous devez donc vous assurer d'importer Androidx. Et vous devez implémenter la dépendance androidx dans le fichier Gradle.
Il n'est pas conseillé de créer un nouvel objet ViewModel avec le mot clé "new".