Dagger Hilt ‘Assisted’ und ‘ViewModelInject’ sind veraltet. im Dolchgriff-Ansichtsmodell 1.0.0-alpha03

Lesezeit: 4 Minuten

In Dolchgriffansicht Modell 1.0.0-alpha01

    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01"
    implementation 'com.google.dagger:hilt-android:2.28-alpha'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
    kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'

Ich kann das unten verwenden

class MyViewModel @ViewModelInject constructor(
    private val repository: Repository,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {

    // Some codes...
}

Wenn ich jedoch zu Dagger Hilt View Model 1.0.0-alpha03 migriere

    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    implementation 'com.google.dagger:hilt-android:2.31.2-alpha'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
    kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'

Ich habe die Warnungen bekommen

'Assisted' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'ViewModelInject' is deprecated. Deprecated in Java
'Assisted' is deprecated. Deprecated in Java

Was ist die neue Art, daran zu arbeiten?

Verwenden Sie in alpha03 das Neue @HiltViewModel und das Normale @Inject jetzt wie unten gezeigt.

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {

    // Some code
}

  • Was ist, wenn wir eine Zeichenfolge vom Fragment an den Konstruktor von ViewModel übergeben und auch Repositorys injizieren möchten

    – Daniel Javaid

    10. Mai 2021 um 13:59 Uhr

  • @DaniyalJavaid Ich denke, es gibt nur zwei Möglichkeiten. 1) Verwenden Sie ein SavedStateHandle als Container für Fragmentargumente (genau wie in der Antwort). 2) Erstellen Ihre eigene AssistedFactory.

    – Daniil Pawlenko

    16. Mai 2021 um 14:14 Uhr

  • Können wir private Parameter verwenden? manchmal erhalte ich “cannot be final”-Fehler.

    – Amg91

    10. Dezember 2021 um 4:24 Uhr

Benutzer-Avatar
Taki

In der letzten Aktualisierung des Dolchgriffs wurden nur wenige Änderungen vorgenommen, sodass Sie in Ihrem Fall verwenden können @HiltViewModel und @Inject um es mit ViewModel zu verwenden.

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository,
    private val savedStateHandle: SavedStateHandle
) : ViewModel(), LifecycleObserver {
    // Some codes...
}

Auch wenn Sie verwendet haben ApplicationComponentim neuesten Update wird es geändert in SingletonComponent.
Also in Ihrer Modulklasse auf diese Weise.

@Module
@InstallIn(SingletonComponent::class.java)
object hiltmodel....{}

  • Bitte schauen Sie noch einmal in die Dokumentation. Deine Beispiele sind falsch. @HiltViewModelInject wird nicht mehr benötigt, da es veraltet ist.

    – Andreas

    14. Februar 2021 um 11:36 Uhr

  • Bist du dir sicher ? weil wir früher nur ViewModelInject hinzugefügt haben, aber in der neuesten Version verwenden wir HiltViewModel zusammen mit Inject für den Viewmodel-Klassenkonstruktor

    – Taki

    14. Februar 2021 um 15:06 Uhr

  • @Andrew schau mal hier, dagger.dev/hilt/view-model

    – Taki

    14. Februar 2021 um 15:11 Uhr

  • Nun, vielleicht sollten Sie sich Ihren eigenen Link ansehen. Wie Sie deutlich sehen können, ist Ihr Beispiel falsch! ‘@Assisted’ wird nicht mehr vor savedstatehandle benötigt und es sollte ‘@HiltViewModel’ und nicht ‘@HiltViewModelInject’ sein, wie Sie geschrieben haben.

    – Andreas

    14. Februar 2021 um 15:26 Uhr

  • @Andrew danke für die Klarstellung, war eindeutig mein Fehler, schätzte die Korrektur

    – Taki

    14. Februar 2021 um 16:09 Uhr

Benutzer-Avatar
Anubhav

@ViewModelInject ist veraltet und wurde durch ersetzt @HiltViewModel.

Das mit kommentierte ViewModel HiltViewModel wird zur Erstellung durch HiltViewModelFactory verfügbar sein. Das HiltViewModel, das einen mit annotierten Konstruktor enthält Injizieren seine Abhängigkeiten werden in den Konstruktorparametern definiert, die von Dagger’s Hilt injiziert werden.
https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel

Ein einfaches ViewModel sieht nun so aus:

@HiltViewModel
class MainViewModel @Inject constructor(application: Application) :
AndroidViewModel(application) {
}

or

@HiltViewModel
class MainViewModel @Inject constructor() :
ViewModel() {
}

whatever your use case might be.

Erhalten Sie den folgenden Fehler nach dem Upgrade von hilt auf v2.31+?:

2021-04-02 20:05:22.443 3718-3718/com.demo.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.demo.app, PID: 3718
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.demo.app/com.demo.app.ux.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.demo.app.ux.viewmodels.MainViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) .....

Versuchte die meisten Dinge, die in erwähnt wurden hier und auch das Hinzufügen eines separaten Moduls mit der Modellansichtsanbieter-API, aber dass nichts davon funktionierte, war eine Sache, die beim Upgrade vermisst wurde, auch die Klassenpfadversion zu ändern.

Damit dies funktioniert, müssen wir den Klassenpfad auf 2.31 und höher aktualisieren, der in Ihrem Projektgradle vorhanden ist:

classpath "com.google.dagger:hilt-android-gradle-plugin:2.31-alpha"

Freigaben vor Januar 2021 wird die neueste @HiltViewModel-Anmerkung nicht unterstützt.

Also in der Projektebene gradle in Abhängigkeiten ersetzen Hilt-Version auf 2.33-beta

buildscript{
    ext.hiltVersion = "2.33-beta"
    dependencies{
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
    }
}

und in der Ansichtsmodellklasse anstelle von @viewmodelinject vor dem Konstruktor entfernen Sie das und tun Sie dies

@HiltViewModel
class TasksViewModel @Inject constructor(val taskDao: TaskDao) : ViewModel() {...}

1103450cookie-checkDagger Hilt ‘Assisted’ und ‘ViewModelInject’ sind veraltet. im Dolchgriff-Ansichtsmodell 1.0.0-alpha03

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

Privacy policy