Mit Blick auf die Google Text & Tabellen für ViewModel
Sie zeigen die folgenden Beispielcode, wie ein bekommen ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Bei Verwendung der neuesten Abhängigkeit android.arch.lifecycle:extensions:1.1.1
gibt es keine solche Klasse ViewModelProviders
.
Gehen zur Dokumentation für ViewModelProviders
sah ich einen Kommentar zu sagen:
Diese Klasse wurde in API-Level 1.1.0 nicht mehr unterstützt. Verwenden Sie ViewModelProvider.AndroidViewModelFactory
Das Problem ist, dass beim Versuch, eine zu verwenden ViewModelProvider.AndroidViewModelFactory
, keine äquivalente of
Methode zum Abrufen der Instanz von gefunden werden kann ViewModel
.
Was ich versucht habe:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
Daher der Name der Methode. Bei create
jedem Aufruf erhalte ich eine neue Instanz des ViewModel, nach der ich nicht suche.
Irgendwelche Ideen, was ist der Ersatz für veralteten Code oben?
Antworten:
UPDATE 2020-06-16 : Derzeit
ViewModelProviders
veraltet und sollte nicht mehr verwendet werden. Diese Frage und Antwort stammte von Ende 2018, als dies nicht der Fall war. Diese Frage und Antwort gilt auch für die ältere Edition von Architecture ComponentsViewModelProviders
, nicht für die AndroidX-Edition.Ja da ist. Um dies zu demonstrieren:
Erstellen Sie ein neues Projekt in Android Studio 3.2.1 (mit Kotlin,
minSdkVersion
21, Vorlage "Leere Aktivität").Fügen Sie
android.arch.lifecycle:extensions:1.1.1
zu den Abhängigkeiten desapp
Moduls hinzuDies gibt Ihnen ein
app/build.gradle
wie:Sie werden dann sehen, dass die Bibliothek in "Externe Bibliotheken" mit dieser Klasse angezeigt wird:
Und Sie können auf diese Klasse verweisen:
Dieser Kommentar befindet sich unter dem
ViewModelProviders.DefaultFactory
Klasseneintrag und bezieht sich auf diese Klasse, nicht aufViewModelProviders
:Verwenden Sie
ViewModelProviders
.quelle
ViewModelProviders.of()
existiert nicht mehr.Ich verwende die Lifecycle-Extensions-
2.2.0
Version:Es sollte Arbeit sein, mit
ViewModelProvider
Konstruktor.Update 2020/5/15
Ich finde einen anderen eleganten Weg zu erreichen, Android KTX kann helfen
Ref: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
25.06.2020: Der Fall des Delegierten wurde korrigiert
quelle
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
oder ablehntEditText
und eine neue Komponente einführt.Wie @FantasyFang in seiner Antwort erwähnt hat, verwenden Sie die neueste Version für die,
lifecycle:lifecycle-extensions
die in diesem Moment ist2.2.0-alpha03
. Daher sollten Sie in Ihre build.gradle-Datei die folgende Zeile einfügen:Wenn Sie Java verwenden, übergeben Sie diese Argumente zur Lösung dieses Problems direkt an den Konstruktor von ViewModelProvider :
Oder wenn Sie keine Fabrik benutzen, benutzen Sie einfach:
Ohne das Werksobjekt zu übergeben.
quelle
Ab 2.2.0. Die Lebenszykluserweiterungen sind veraltet. Siehe Google-Dokumentation .
Dies ist der Ausschnitt aus der Seite:
Die neuen Bibliotheken sind:
Der neue Code für JAVA:
Oder für Kotlin:
quelle
Veraltet von:
ViewModelProviders.of(this, provider).get(VM::class.java)
Zu:
ViewModelProvider(this, provider).get(VM::class.java)
quelle
Anfang 2020 hat Google die ViewModelProviders-Klasse in Version 2.2.0 der AndroidX-Lebenszyklusbibliothek abgelehnt.
Es ist nicht mehr erforderlich, ViewModelProviders zum Erstellen einer Instanz eines ViewModel zu verwenden. Sie können stattdessen Ihre Fragment- oder Aktivitätsinstanz an den ViewModelProvider-Konstruktor übergeben.
Wenn Sie den Code wie folgt verwenden:
Sie erhalten eine Warnung, dass ViewModelProviders veraltet ist.
Nehmen Sie die folgenden Änderungen vor, um die Verwendung veralteter Bibliotheken zu vermeiden:
Verwenden Sie in der Datei build.gradle (Modul: App) Version 2.2.0 der Lebenszykluskomponenten:
Wenn Sie stattdessen das ViewModel aus einem Fragment verwenden möchten, verwenden Sie
fragment-ktx enthält automatisch activity-ktx, sodass Sie nicht beide in den Abhängigkeiten angeben müssen.
Sie müssen Java 8 im Android-Bereich angeben:
Ändern Sie in Ihrem Fragment oder Ihrer Aktivität den Import in:
androidx.activity.viewModels importieren
Der Code zum Erstellen eines ViewModel lautet dann:
anstatt
Verwenden Sie das viewModel-Objekt als:
Dabei ist newNumer ein LiveData-Objekt
In einem Fragment, das Sie für das ViewModel der Aktivität freigeben möchten, würden Sie es verwenden
Dies entspricht dem Übergeben der Activity-Instanz in der (veralteten)
ViewModelProviders.of()
Funktion.quelle
ViewModelProviders.of () ist veraltet.
Verwenden Sie ViewModelProvider-Konstruktoren direkt, da sie jetzt die Standardrolle ViewModelProvider.Factory übernehmen.
quelle
Ja @Tarek, es ist veraltet. Jetzt mit AndroidX verwenden:
quelle
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
sonstonCleared()
nicht ordnungsgemäß funktioniert und ViewModel bei Konfigurationsänderungen nicht beibehalten wird. Verwenden Sie diese Antwort nicht.Wahrscheinlich können Sie einfach verwenden:
ohne
android.arch.lifecycle:extensions:1.1.1
als Abhängigkeit hinzufügen zu müssen .quelle
Verwenden Sie ViewModelProvider direkt anstelle des Benutzers ViewModelProviders.of (), wie in den Dokumenten erwähnt.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
quelle
Ich benutze
android X
und hatte auch dieses Problem.Zunächst sollten Sie diese Abhängigkeiten zu Ihrem hinzufügen
Gradle
:In meinem Fall war die $ lifecycle_version
2.2.0-rc02
Zweitens: Der Import für das
ViewModelProvider
sollte sein:Dann können Sie Ihr vIewModel wie in den folgenden Beispielen initialisieren:
quelle
androidx.lifecycle:lifecycle-compiler
ist obsolet vonandroidx.lifecycle:lifecycle-common-java8
.Was macht die
ViewModelProviders.of()
Methode eigentlich unter der Haube?Es nimmt
Fragment
als Argument, erstellt einViewModelProvider
Objekt und übergibt das Fragment direkt an denViewModelProvider
Konstruktor.Wir können den gleichen Weg auch verwenden.
ZB vorher:
Nach dem:
quelle
ViewModelProvider
einen Konstruktor, der sowohl aViewModelStoreOwner
als auch a erwartetFactory
.Wenn Sie Kotlin verwenden, können Sie den Eigenschaftendelegierten
viewModels()
wie folgt verwenden:Quelle: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
quelle
Ich bin kein Experte, aber ich habe eine Codezeile, die mein Problem in Java gelöst hat. Hoffe das hilft jemandem.
Wie gesagt, ich würde gerne mehr Details liefern, aber dies hat dieses Problem für mich behoben.
quelle
onCleared()
wird nicht auf diese Weise aufgerufen und Ihr ViewModel wird jedes Mal neu erstellt (nicht für Konfigurationsänderungen aufbewahrt).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
. Wenn SieAndroidViewModel
das nicht bekommenApplication
, haben Sie eine Versionsinkongruenz zwischen Lebenszyklus und Aktivität / Fragment.new ViewModelProvider.AndroidViewModelFactory(
anstelle einesnew ViewModelProvider(
.Benutze das:
quelle
Sie können dies stattdessen verwenden:
"this" in den Klammern ist der Eigentümer der YourViewModel-Instanz.
quelle
Diese Antwort ist für Java, aber Sie können den Hauptpunkt verstehen. Die Lösung besteht darin, dass Sie ViewModelProvider verwenden müssen, da ViewModelProviders veraltet sind :
Beispiel für die Verwendung ist:
Vergessen Sie auch nicht, Gradle-Abhängigkeiten zu aktualisieren : Suchen Sie hier nach den letzten Versionen
!!! Seien Sie jedoch vorsichtig, da einige Antworten diese Lösung empfehlen, sie jedoch bei mir nicht funktioniert hat:
Denn als ich diesen Weg benutzte, kam ich unter die Fehlermeldung:
@canerkaseler
quelle
create
,onCleared()
funktioniert dies nicht richtig.androidx.core
und Ihrenandroidx.lifecycle
Abhängigkeiten.Wenn Sie Dolch verwenden, passieren Sie die Fabrik im Konstruktor
quelle
Wenn Sie diese Implementierung haben
Versuchen zu benutzen
viewModel = MainViewModel()
quelle
Versuche dies...
quelle
es sollte so funktionieren
quelle