En regardant les documents Google pour ViewModel
, ils montrent l'exemple de code ci-dessous sur la façon d'obtenir un ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Lors de l'utilisation de la dernière dépendance android.arch.lifecycle:extensions:1.1.1
, une telle classe n'existe pas ViewModelProviders
.
En allant à la documentation pour ViewModelProviders
, j'ai vu un commentaire disant:
Cette classe était obsolète au niveau d'API 1.1.0. Utilisez ViewModelProvider.AndroidViewModelFactory
Le problème est que, lorsque vous essayez d'utiliser ViewModelProvider.AndroidViewModelFactory
, vous ne trouvez pas de of
méthode équivalente pour obtenir l'instance du ViewModel
.
Ce que j'ai essayé de faire:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
D'où le nom de la méthode create
, j'obtiens une nouvelle instance du ViewModel à chaque fois que je l'appelle, ce qui n'est pas ce que je recherche.
Des idées sur ce qu'est le remplacement du code obsolète ci-dessus?
la source
Réponses:
MISE À JOUR 2020-06-16 : est actuellement
ViewModelProviders
obsolète et ne devrait plus être utilisée. Cette question et cette réponse dataient de fin 2018, alors que ce n'était pas le cas. Cette question et réponse concerne également l'ancienne édition des composants d'architectureViewModelProviders
, et non l'édition AndroidX.Oui il y a. Pour démontrer ceci:
Créer un nouveau projet dans Android Studio 3.2.1 (avec Kotlin,
minSdkVersion
21, modèle "activité vide")Ajouter
android.arch.lifecycle:extensions:1.1.1
aux dépendances duapp
moduleCela vous donnera un
app/build.gradle
comme:Vous verrez alors cette bibliothèque apparaître dans "Bibliothèques externes" avec cette classe:
Et vous pourrez référencer cette classe:
Ce commentaire se trouve sous l'
ViewModelProviders.DefaultFactory
entrée de classe et fait référence à cette classe, pasViewModelProviders
:Utilisez
ViewModelProviders
.la source
ViewModelProviders.of()
n'existe plus.J'utilise la
2.2.0
version lifecycle-extensions :Cela devrait être du travail, en utilisant le
ViewModelProvider
constructeur.Mise à jour du 15/05/2020
Je trouve un autre moyen élégant de réaliser, Android KTX peut aider
Réf: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
2020/06/25: correction du cas du délégué
la source
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
ouEditText
et introduira un nouveau composant.Comme @FantasyFang l'a mentionné dans sa réponse, utilisez la dernière version pour ce
lifecycle:lifecycle-extensions
qui est en ce moment2.2.0-alpha03
. Vous devez donc ajouter dans votre fichier build.gradle la ligne suivante:Pour ceux qui utilisent Java, pour résoudre ce problème, transmettez ces arguments directement au constructeur de ViewModelProvider :
Ou si vous n'utilisez pas d'usine, utilisez simplement:
Sans passer votre objet d'usine.
la source
À partir de 2.2.0. les extensions de cycle de vie sont devenues obsolètes. Reportez-vous à la documentation Google .
Voici la coupe de la page:
Les nouvelles bibliothèques sont:
Le nouveau code pour JAVA:
Ou pour Kotlin:
la source
Obsolète de:
ViewModelProviders.of(this, provider).get(VM::class.java)
À:
ViewModelProvider(this, provider).get(VM::class.java)
la source
Début 2020, Google a déconseillé la classe ViewModelProviders , dans la version 2.2.0 de la bibliothèque de cycle de vie androidx.
Il n'est plus nécessaire d'utiliser ViewModelProviders pour créer une instance d'un ViewModel, vous pouvez passer votre instance de Fragment ou Activity au constructeur ViewModelProvider à la place.
Si vous utilisez le code comme:
vous recevrez un avertissement indiquant que ViewModelProviders est obsolète.
Pour éviter d'utiliser des bibliothèques obsolètes, apportez les modifications suivantes:
Dans le fichier build.gradle (Module: app), utilisez la version 2.2.0 des composants du cycle de vie:
Si vous souhaitez utiliser le ViewModel à partir d'un fragment à la place, utilisez
fragment-ktx inclut automatiquement activity-ktx, vous n'avez donc pas besoin de spécifier les deux dans les dépendances.
Vous devez spécifier Java 8 dans la section Android:
Dans votre fragment ou activité, modifiez l'importation en:
importer androidx.activity.viewModels
Le code pour créer un ViewModel devient alors:
au lieu de
Utilisez l'objet viewModel comme:
où newNumer est un objet LiveData
Dans un fragment que vous souhaitez partager le ViewModel de l'activité, vous utiliseriez
C'est l'équivalent de passer l'instance Activity dans la fonction (obsolète)
ViewModelProviders.of()
.la source
ViewModelProviders.of () est obsolète.
Utilisez directement les constructeurs ViewModelProvider car ils gèrent désormais le rôle ViewModelProvider.Factory par défaut.
la source
Oui @Tarek, il est obsolète. À utiliser maintenant avec AndroidX:
la source
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
sinon votreonCleared()
ne fonctionnera pas correctement, et ViewModel ne sera pas conservé pendant le changement de configuration. N'utilisez pas cette réponse.Vous pouvez probablement simplement utiliser:
sans avoir besoin d'ajouter
android.arch.lifecycle:extensions:1.1.1
comme dépendance.la source
Utilisez ViewModelProvider directement au lieu de l'utilisateur ViewModelProviders.of () comme mentionné dans la documentation.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
la source
J'utilise
android X
et j'ai également ce problème.Tout d'abord , vous devez ajouter ces dépendances à votre
Gradle
:Dans mon cas, la $ lifecycle_version était
2.2.0-rc02
Deuxièmement: l'importation pour le
ViewModelProvider
devrait être:Ensuite, vous pouvez initialiser votre vIewModel comme les exemples ci-dessous:
la source
androidx.lifecycle:lifecycle-compiler
c'est obsolète parandroidx.lifecycle:lifecycle-common-java8
.En fait, que fait la
ViewModelProviders.of()
méthode sous le capot?Il prend
Fragment
comme argument, crée unViewModelProvider
objet et passe le fragment directement auViewModelProvider
constructeur.Nous pouvons également utiliser la même méthode.
Par exemple avant:
Après:
la source
ViewModelProvider
a un constructeur qui attend à la fois aViewModelStoreOwner
et aFactory
.Si vous utilisez Kotlin, vous pouvez utiliser le délégué de propriété
viewModels()
comme ceci:Source: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
la source
Je ne suis pas un expert mais j'ai une ligne de code qui a résolu mon problème en Java. J'espère que cela aide quelqu'un.
Comme je l'ai dit, j'aimerais fournir plus de détails, mais cela a résolu ce problème pour moi.
la source
onCleared()
ne sera pas appelé de cette façon et votre ViewModel sera recréé à chaque fois (non conservé pour les modifications de configuration).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
. Si vousAndroidViewModel
n'obtenez pas leApplication
, vous avez une incompatibilité de version entre Lifecycle et Activity / Fragment.new ViewModelProvider.AndroidViewModelFactory(
lieu d' un fichiernew ViewModelProvider(
.Utilisez ceci:
la source
Vous pouvez utiliser ceci à la place:
"this" entre parenthèses est le propriétaire de l'instance YourViewModel.
la source
Cette réponse est pour Java mais vous pouvez comprendre le point principal. La solution est que vous devez utiliser ViewModelProvider car ViewModelProviders est obsolète :
Exemple d'utilisation:
N'oubliez pas non plus de mettre à jour les dépendances Gradle : vérifiez ici les dernières versions de celles-ci
!!! Cependant, soyez prudent car certaines réponses recommandent cette solution mais cela n'a pas fonctionné pour moi:
Parce que lorsque j'ai utilisé de cette façon, j'ai eu le message d'erreur ci-dessous:
@canerkaseler
la source
create
,onCleared()
cela ne fonctionnera pas correctement.androidx.core
vosandroidx.lifecycle
dépendances et vos dépendances.Lorsque vous utilisez un poignard, vous passerez l'usine dans le constructeur
la source
Si vous avez cette implémentation
Essayez d'utiliser
viewModel = MainViewModel()
la source
Essaye ça...
la source
ça devrait fonctionner de cette façon
la source