web-dev-qa-db-fra.com

Comment obtenir une instance de ViewModel en activité en 2020?

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);

4
Gerke

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);

0
Gerke

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)
0
Devara

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.

0
vaishak bg

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".

0
barutto