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?
6 Réponses :
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)
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)
vous pouvez essayer ce code
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(UserViewModel::class.java)
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)
Si vous aviez un ViewModel simple étendant AndroidViewModel sans aucun paramètre de constructeur supplémentaire, c'est comme suit
- Étendez AndroidViewModel sans aucun paramètre de constructeur supplémentaire
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)
- 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
- Étendez AndroidViewModel avec tous les paramètres de constructeur supplémentaires
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
- Créer une nouvelle fabrique de modèles de vue étendant ViewModelProvider.AndroidViewModelFactory
val viewModel = ViewModelProvider(this).get(FooViewModel::class.java)
- Créer un modèle de vue dans l'activité
class FooViewModel(application: Application) : AndroidViewModel(application) {}
Ouvrez build.gradle (Module: ~ .app)
Modifier la version appcompat en 1.3.0-alpha02
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
Mon autre réponse utilisant AndroidViewModelFactory est meilleure que cela, je pense.
Vous pouvez utiliser AndroidViewModelFactory comme ceci:
mViewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)) .get(MainViewModel::class.java)
Pouvez-vous partager un morceau de code que vous utilisez pour créer
ViewModel
instance deViewModel
?mViewModel = ViewModelProviders.of (this) .get (MainViewModel :: class.java)