Wie behebe ich die Fehlermeldung: „Vererbung von einer Schnittstelle mit ‚@JvmDefault‘-Mitgliedern ist nur mit der Option -Xjvm-default zulässig“

Lesezeit: 4 Minuten

Benutzeravatar von FuManchuObey
FuManchuObey

Ich bin neu in der Android-Entwicklung und baue gerade meine erste echte App. Ich versuche, eine MVVM-Architektur zu implementieren. Aus diesem Grund habe ich für jedes Fragment ein ViewModel und jedes ViewModel verfügt über eine ViewModelFactory. So habe ich es zumindest verstanden.

Ich verwende den Standardcode, den anscheinend jeder für die Fabrik verwendet:

class ExampleViewModelFactory(private val exampleDao: ExampleDao) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(exampleViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return ExampleViewModel(exampleDao) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

Das Problem ist nun, dass der Compiler mir den folgenden Fehler anzeigt:

e: C:\Users\ …\ExampleViewModel.kt: (64, 7): Die Vererbung von einer Schnittstelle mit „@JvmDefault“-Mitgliedern ist nur mit der Option -Xjvm-default zulässig

Und dieser Fehler wird von der viewModelFactory-Klasse erzeugt, die ich im viewModel implementiert habe. Ich kann wirklich nicht sagen, was das bedeutet, und ich kann nichts Hilfreiches oder auch nur im Zusammenhang mit meinem spezifischen Problem finden. Ich habe grundsätzlich einige grundlegende Tutorials zum Erstellen Ihrer ersten App befolgt, aber es stoßen immer wieder solche Fehler auf. In den meisten Fällen konnte ich das Problem selbst beheben, aber dieses Mal ist es anders.

Ich weiß, dass viele von Ihnen über viel Erfahrung und Wissen verfügen, daher hoffe ich, dass einige von Ihnen die Zeit finden, mir zu helfen und mir einen Hinweis zu geben, was ich tun kann, um das Problem zu beheben.

Benutzeravatar von ianhanniballake
ianhanniballake

Es scheint, als wären Sie entweder direkt oder indirekt (über eine andere Bibliothek) davon abhängig Lebenszyklus 2.5.0-alpha01.

Gemäß dieses Problem:

Sie müssen Folgendes vorübergehend zu Ihrem hinzufügen build.gradle:

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += [
                "-Xjvm-default=all",
        ]
    }
}

Beachten Sie, dass Sie unter bestimmten Umständen möglicherweise Folgendes verwenden möchten all-compatibility anstatt allerfahren Sie mehr darüber in Jebrains Blogpost.

Ab Kotlin 1.6.20 benötigen Sie touch build.gradle nicht mehr. Weitere Informationen finden Sie unter KT-47000

  • Wenn du benutzt KotlinComplie und habe einen Fehler erhalten, den Sie verwenden können org.jetbrains.kotlin.gradle.tasks.KotlinCompile

    – Chirag Savsani

    7. Februar 2022 um 11:42 Uhr

  • In welchem ​​Build.gradle soll ich das hinzufügen?

    – Shoaib Kakal

    20. Februar 2022 um 6:52 Uhr

  • build.gradle des @ShoaibKhalid-Moduls

    – theapache64

    8. März 2022 um 19:27 Uhr

  • @TedLavender stattdessen onf tasks.withType(KotlinCompile).configureEach { Verwenden tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {

    – Chirag Savsani

    17. März 2022 um 11:35 Uhr

  • Wäre es wirklich eine schlechte Praxis, ViewModelProvider.NewInstanceFactory zu erweitern, anstatt ViewModelProvider.Factory zu implementieren?

    – Benutzer2857033

    28. August 2022 um 6:41 Uhr

Vivek Guptas Benutzeravatar
Vivek Gupta

Aktualisieren; Wenn du benutzt 1.6.20 Version von Kotlin, dann ändernd build.gradle ist nicht nötig.

Alte Antwort:

Versuchen Sie, diese Zeile in den Android{}-Block in der Datei build.gradle des Moduls einzufügen

 kotlinOptions{
    freeCompilerArgs += [
            "-Xjvm-default=all",
    ]
}

Wenn der obige Code nicht funktioniert, fügen Sie die folgenden Zeilen in den Block dependencies{} ein

    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach{
    kotlinOptions{
        freeCompilerArgs +=["-Xjvm-default=all",]
    }
}

  • Der erste hat es behoben, danke 🙂

    – Harshal Pudale

    18. November 2022 um 15:35 Uhr

Kotlin-Version (kts) der Antwort von @ianhanniballake

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configureEach {
    kotlinOptions {
        freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all"
    }
}

  • Sollte eine dieser Aussagen am Ende von hinzugefügt werden? build.gradle oder gibt es einen bestimmten Abschnitt der Datei, z android oder dependencies dass es darin platziert werden sollte? Beim Hinzufügen des Codes und Synchronisieren erhalte ich eine Fehlermeldung: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method withType() for arguments

    – John Harrington

    16. März 2022 um 17:33 Uhr

Verwenden Sie die stabile Version, in diesem Fall 2.4.1. Ich habe das gleiche Problem und habe es durch diese Änderung gelöst.

https://developer.android.com/jetpack/androidx/releases/lifecycle

In meinem Fall lag das Problem in der Version der Kotlin-Bibliotheken

Ich habe in build.gradle verwendet:

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10

und in build.gradle (App) [for Java compatibility]:

implementation "org.jetbrains.kotlin:kotlin-stdlib:1.6.10"

dann erstelle ich eine gemeinsame kotlin_version-Variable in ext:

buildscript {
  ext {
    ...
    kotlin_version='1.7.10'
  } ...

und für beide verwenden (jeweils an der entsprechenden Stelle):

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

Benutzeravatar von Mahmoud Elgamal
Mahmoud Elgamal

Verwenden Sie diese Abhängigkeiten in Ihrem Gradle

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'

Bokens Benutzeravatar
Boken

Wenn Sie den Spaß überschreiben, erstellen Sie ihn ViewModelProvider.Factory Vermeiden Sie das Fragezeichen nach vieModel

Falsch:

<T : ViewModel?>

Richtig:

< T : ViewModel>

Scheint, als ob es einige Änderungen in der Klasse gegeben hätte.

1451460cookie-checkWie behebe ich die Fehlermeldung: „Vererbung von einer Schnittstelle mit ‚@JvmDefault‘-Mitgliedern ist nur mit der Option -Xjvm-default zulässig“

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

Privacy policy