Wie bekomme ich 2020/21 eine Instanz von ViewModel in Aktivität?

Lesezeit: 3 Minuten

Benutzeravatar von Gerke
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.

    – Gerke

    31. Januar 2020 um 15:07 Uhr


Sie sollten Ihre Gradle-Datei aktualisieren auf:

Implementierung „androidx.lifecycle:lifecycle-extensions:2.2.0“

Und aufgrund dieser Änderung können Sie Activity an den von Ihnen erwähnten Konstruktor übergeben:

mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

Verwenden Fragment-ktx libr in Ihrer App können Sie viewModel wie folgt abrufen

Aktualisieren Sie zuerst die Gradle-Datei als App -> build.gradle

implementation 'androidx.fragment:fragment-ktx:1.1.0'

// 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

Benutzeravatar des Jungen
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

Benutzeravatar von Gerke
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

Benutzeravatar von David Buck
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.

1431660cookie-checkWie bekomme ich 2020/21 eine Instanz von ViewModel in Aktivität?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy