Anvil für Kotlin: Vollständiges Tutorial mit Codebeispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Anvil für Kotlin: Vollständiges Tutorial mit Codebeispielen

1. Was ist Anvil und warum wird es benötigt?

Anvil ist eine Codegenerierungsbibliothek für Kotlin, die auf den Dependency-Injection (DI)-Frameworks Dagger und Hilt aufbaut. Ihr Hauptziel ist es, die lästige Arbeit des Schreibens von Boilerplate-Code für DI-Module, Komponenten, Factories und Einstiegspunkte zu eliminieren. Anstatt Dagger-Module manuell zu erstellen und zu annotieren, markieren Sie Ihre Klassen einfach mit Anvil-Annotationen, und die Bibliothek generiert den gesamten benötigten Code während der Kompilierung.

Warum ist das wichtig? In großen Android- oder Kotlin-Multiplattform-Projekten kann die Anzahl der Klassen, die im Abhängigkeitsgraphen registriert werden müssen, in die Hunderte gehen. Jedes Mal ein neues Dagger-Modul hinzuzufügen, @Provides oder @Binds zu schreiben, ist langsam, fehleranfällig und erschwert das Refactoring. Anvil löst dieses Problem, indem es die Erstellung von Modulen auf Basis einfacher Annotationen automatisiert. Dies ist besonders nützlich in einer Architektur mit Feature-Modulen, bei der jedes Modul unabhängig erstellt und getestet werden muss.

Anvil ist eng in Gradle integriert und verwendet Kotlin Symbol Processing (KSP) oder KAPT zur Codegenerierung. Es unterstützt sowohl Dagger als auch Hilt und kann in Multiplattform-Projekten eingesetzt werden. Die Bibliothek wurde von Square entwickelt, einem Unternehmen, das für seine Android-Entwicklungstools (Retrofit, OkHttp, Moshi) bekannt ist.

2. Installation

Um Anvil in Ihr Kotlin/Gradle-Projekt zu integrieren, fügen Sie die folgenden Abhängigkeiten in Ihre build.gradle.kts-Datei (auf Projektebene) ein:

// In der build.gradle.kts (Projekt-Root)
plugins {
    id("com.google.dagger.hilt.android") version "2.48" apply false
    id("com.squareup.anvil") version "2.4.7" apply false
}

Fügen Sie dann im App-Modul (z.B. app/build.gradle.kts) Folgendes hinzu:

plugins {
    id("com.android.application")
    kotlin("android")
    id("com.google.dagger.hilt.android")
    id("com.squareup.anvil")
}

android {
    // ... Ihre Android-Konfiguration
}

dependencies {
    // Hilt
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48")

    // Anvil
    implementation("com.squareup.anvil:annotations:2.4.7")
    ksp("com.squareup.anvil:compiler:2.4.7") // oder kapt, falls Sie KSP nicht verwenden
}

Wenn Sie KSP anstelle von KAPT verwenden, stellen Sie sicher, dass das KSP-Plugin eingebunden ist:

plugins {
    id("com.google.devtools.ksp") version "1.9.0-1.0.13"
}

Nach der Gradle-Synchronisation ist Anvil einsatzbereit.

3. Schnellstart – Minimales funktionierendes Beispiel

Betrachten wir ein einfaches Beispiel: Wir haben eine Klasse UserRepository, die in MainViewModel injiziert werden soll.

Schritt 1: Erstellen Sie ein Interface oder eine Klasse, die injiziert werden soll:

// UserRepository.kt
class UserRepository @Inject constructor() {
    fun getUser(): String = "Max Mustermann"
}

Schritt 2: Erstellen Sie eine Klasse, die die Abhängigkeit verwendet:

// MainViewModel.kt
class MainViewModel @Inject constructor(
    private val userRepository: UserRepository
) {
    fun getUserName(): String = userRepository.getUser()
}

Schritt 3: Erstellen Sie eine Hilt- (oder Dagger-) Komponente mit Anvil:

// AppComponent.kt
@Singleton
@Component
@MergeComponent(AppScope::class) // Anvil-Annotation
interface AppComponent {
    fun inject(app: MyApplication)
}

// AppScope.kt (Scope definieren)
@Scope
@MustBeDocumented
annotation class AppScope

Schritt 4: Registrieren Sie die Klassen im Abhängigkeitsgraphen mit Anvil-Annotationen:

// UserRepository.kt (hinzugefügt                    

Empfehlungen