3
votes

Dans kotlin, comment utiliser ViewModel avec ViewModelProvider.AndroidViewModelFactory?

Dans mon projet actuel, j'utilise la ligne suivante:

mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

Par exemple, un ViewModel mais dans https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders.html#ViewModelProviders () recommande d'utiliser ViewModelProvider.AndroidViewModelFactory car ViewModelProviders() était obsolète au niveau d'API 1.1.0.

une idée à cet effet?


2 commentaires

Pouvez-vous partager un morceau de code que vous utilisez pour créer ViewModel instance de ViewModel ?


mViewModel = ViewModelProviders.of (this) .get (MainViewModel :: class.java)


6 Réponses :


4
votes

EDIT: La question d'origine n'est plus pertinente, car vous ne devriez plus utiliser la classe utilitaire ViewModelProviders . Au lieu de cela, vous devez créer une instance de ViewModelProvider comme ceci:

class MyViewModel(application: Application) : AndroidViewModel(application) {

    // use application

}

Réponse originale ci-dessous.


ViewModelProviders est juste une classe utilitaire avec des méthodes statiques, il n'est pas nécessaire de l'instancier (il n'y a pas de méthode d'instance de toute façon), donc le constructeur obsolète ne devrait pas être un problème.

La façon dont vous utilisez est en appelant son approprié of méthode pour votre cas d'utilisation, en passant dans un Fragment ou Activity , puis appeler get sur le ViewModelProvider il retourne:

val viewModel = ViewModelProviders.of(thisFragment).get(MyViewModel::class.java)

Si vous ne fournissez pas votre propre fabrique dans le deuxième paramètre de la méthode of , AndroidViewModelFactory sera utilisé par défaut. Cette implémentation peut créer des sous-classes ViewModel qui n'ont pas de paramètres de constructeur, ou celles qui étendent AndroidViewModel , comme celles-ci:

val viewModel = ViewModelProvider(thisFragment).get(MyViewModel::class.java)


3 commentaires

ouais j'utilise ce code mais comment utiliser ViewModelProvider.AndroidViewModelFactory?


Mis à jour ma réponse.


Cette classe est obsolète, utilisez ViewModelProvider (sans les s)



2
votes

vous pouvez essayer ce code

    ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(UserViewModel::class.java)


0 commentaires

1
votes

Donc, c'est assez simple:

// This is the new way to create a viewModel.
viewModel = ViewModelProvider(owner).get(MyViewModel::class.java)

//This is the new way to create a viewModel with a factory.
viewModel = ViewModelProvider(owner, mViewModelFactory).get(MyViewModel::class.java)

// This is the deprecated way to create a viewModel.
viewModel = ViewModelProviders.of(owner).get(MyViewModel::class.java)

//This is the deprecated way to create a viewModel with a factory.
viewModel = ViewModelProviders.of(owner, mViewModelFactory).get(MyViewModel::class.java)


0 commentaires

4
votes

Si vous aviez un ViewModel simple étendant AndroidViewModel sans aucun paramètre de constructeur supplémentaire, c'est comme suit

  1. Étendez AndroidViewModel sans aucun paramètre de constructeur supplémentaire
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)
  1. Créer un modèle de vue dans l'activité
class FooViewModelFactory(val application: Application, val foo: Foo): ViewModelProvider.AndroidViewModelFactory(application) {

            override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                return FooViewModel(
                    application, foo
                ) as T
            }

     }

Mais si vous aviez un ViewModel étendant AndroidViewModel avec des paramètres de constructeur supplémentaires, c'est comme suit

  1. Étendez AndroidViewModel avec tous les paramètres de constructeur supplémentaires
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
  1. Créer une nouvelle fabrique de modèles de vue étendant ViewModelProvider.AndroidViewModelFactory
val viewModel = ViewModelProvider(this).get(FooViewModel::class.java)
  1. Créer un modèle de vue dans l'activité
class FooViewModel(application: Application) : AndroidViewModel(application) {}


0 commentaires

1
votes
  1. Ouvrez build.gradle (Module: ~ .app)

  2. Modifier la version appcompat en 1.3.0-alpha02

     implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
    

1 commentaires

Mon autre réponse utilisant AndroidViewModelFactory est meilleure que cela, je pense.



0
votes

Vous pouvez utiliser AndroidViewModelFactory comme ceci:

mViewModel = ViewModelProvider(this,
            ViewModelProvider.AndroidViewModelFactory(application))
            .get(MainViewModel::class.java)


0 commentaires