Wie bekomme ich 2020/21 eine Instanz von ViewModel in Aktivität?
Lesezeit: 3 Minuten
Gerke
Ich bin neu im mvvm-Muster. Ich habe ein ViewModel für die Hauptaktivität erstellt. Jetzt möchte ich eine Instanz des ViewModel in der Hauptaktivität abrufen.
Die meisten Tutorials und Antworten hier auf Stackoverflow empfehlen die Verwendung ViewModelProviders.of(...aber das ist veraltet.
Gemäß dieser Frage zu Stackoverflow: ViewModelProviders is deprecated in 1.1.0 main activity in onCreate, mache ich Folgendes (und ich könnte schwören, dass ich es bereits ausgeführt habe): mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Ich erhalte jedoch eine Fehlermeldung, die mir mitteilt, dass kein geeigneter Konstruktor gefunden wurde.
error: no suitable constructor found for ViewModelProvider(MainActivity)
Alternativ, um absolut klarzustellen, dass die MainActivity der ViewModelStoreOwner sein soll, habe ich eine Variable erstellt ViewModelStoreOwner vmso = this; und fügen Sie diese Variable wie folgt in den Konstruktor ein: mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);
Bist du dir sicher, dass du dich beziehst? this ist richtig? Wenn es sich um ein Fragment handelt, müssen Sie verwenden getActivity() Anstatt von this iirc, und wenn Sie in einer Zuhörer- oder anonymen Klasse sind, müssen Sie dies tun MainActivity@this usw usw
– Blundell
28. Januar 2020 um 16:22 Uhr
Ich rufe die Methode in onCreate() der Hauptaktivität auf
– Gerke
28. Januar 2020 um 16:48 Uhr
Beantwortet das deine Frage? Da ViewModelProviders.of() veraltet ist, wie soll ich ein Objekt von ViewModel erstellen?
– Chisko
30. Januar 2020 um 18:14 Uhr
Nein, tut es nicht. Die beschriebene Lösung in Java-Code ist boardViewModel = new ViewModelProvider(this).get(BoardViewModel.class)was gleichbedeutend ist mit mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class); was ich auch schon probiert habe, scheint aber kein geeigneter Konstruktor zu sein.
// erhalten ViewModel in Aktivität oder Fragment wie
private val viewModel: MainActivityViewModel by viewModels()
// Wenn Sie dieselbe Instanz von erhalten möchten ViewModel in ChildFragment wie
private val viewModel: MainActivityViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
Fragment-ktx ist für Fragmente. Wir brauchen Aktivität-ktx
– IgorGanapolsky
22. April 2021 um 1:29 Uhr
Junge
Verwenden val viewModel by viewModels<TheViewModel>() in Aktivitäten und val viewModel by activityViewModels<TheViewModel>() im Fragment, um dasselbe Ansichtsmodell aus der Aktivität zu erhalten (also das Ansichtsmodell gemeinsam zu nutzen).
Dies ist Teil von androidx jetzt
Vielen Dank! Dies ist wahrscheinlich für die meisten Menschen offensichtlich, aber Sie können es auch tun val viewModel: ThisViewModel by viewModels() und val viewModel: ThisViewModel by activityViewModels()
– Eddielement
15. April 2021 um 2:20 Uhr
Bezogen auf Android Dokumentation können Sie Folgendes tun:
KOTLIN
implementation 'androidx.activity:activity-ktx:1.3.1'
val model: MyViewModel by viewModels()
JAVA
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
Holen Sie sich ViewModel auf neue Weise
MainActivityViewModel mainActivityViewModel;
mainActivityViewModel= new ViewModelProvider(this).get(MainActivityViewModel.class);
Das ist Java. Wir verwenden Kotlin.
– IgorGanapolsky
22. April 2021 um 1:31 Uhr
Gerke
Im Moment funktionierte für mich nur die Verwendung von: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);
Dennoch bin ich für jeden Hinweis dankbar, wie dies anders gehandhabt werden kann new ViewModelProvider(this).get(MainActivityViewModel.class);
Das ist Java. Wir verwenden Kotlin.
– IgorGanapolsky
22. April 2021 um 1:31 Uhr
David Buck
Sie können eine verwenden ViewModelFactory:
val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.java)
VMFactory-Code:
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
}
}
Bitte beachten Sie, dass hier meine MainViewModel erweitert AndroidViewModel und erfordert daher Anwendung als Eingabeparameter.
14316600cookie-checkWie bekomme ich 2020/21 eine Instanz von ViewModel in Aktivität?yes
Bist du dir sicher, dass du dich beziehst?
this
ist richtig? Wenn es sich um ein Fragment handelt, müssen Sie verwendengetActivity()
Anstatt vonthis
iirc, und wenn Sie in einer Zuhörer- oder anonymen Klasse sind, müssen Sie dies tunMainActivity@this
usw usw– Blundell
28. Januar 2020 um 16:22 Uhr
Ich rufe die Methode in onCreate() der Hauptaktivität auf
– Gerke
28. Januar 2020 um 16:48 Uhr
Beantwortet das deine Frage? Da ViewModelProviders.of() veraltet ist, wie soll ich ein Objekt von ViewModel erstellen?
– Chisko
30. Januar 2020 um 18:14 Uhr
Nein, tut es nicht. Die beschriebene Lösung in Java-Code ist
boardViewModel = new ViewModelProvider(this).get(BoardViewModel.class)
was gleichbedeutend ist mitmainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
was ich auch schon probiert habe, scheint aber kein geeigneter Konstruktor zu sein.– Gerke
31. Januar 2020 um 15:07 Uhr