Anvil para Kotlin: guia completo com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Anvil para Kotlin: guia completo com exemplos práticos

1. O que é e para que serve

Anvil é uma biblioteca de geração de código para Kotlin que funciona sobre os frameworks de injeção de dependência (DI) Dagger e Hilt. Seu principal objetivo é eliminar o trabalho repetitivo de escrever código boilerplate relacionado a módulos DI, componentes, fábricas e pontos de entrada. Em vez de criar e anotar manualmente os módulos do Dagger, você simplesmente marca as classes com anotações do Anvil, e a biblioteca gera todo o código necessário durante a compilação.

Para que serve isso? Em projetos grandes no Android ou Kotlin Multiplatform, o número de classes que precisam ser registradas no grafo de dependências pode chegar a centenas. Adicionar um novo módulo Dagger toda vez, escrevendo @Provides ou @Binds, é lento, propenso a erros e dificulta a refatoração. O Anvil resolve esse problema automatizando a criação de módulos com base em anotações simples. Isso é especialmente útil em arquiteturas baseadas em feature modules, onde cada módulo precisa ser compilado e testado de forma independente.

O Anvil se integra diretamente com o Gradle e usa o Kotlin Symbol Processing (KSP) ou KAPT para gerar código. Ele suporta tanto Dagger quanto Hilt e funciona em projetos multiplataforma. A biblioteca foi desenvolvida pela Square, conhecida por suas ferramentas para desenvolvimento Android (Retrofit, OkHttp, Moshi).

2. Instalação

Para instalar o Anvil no seu projeto Kotlin/Gradle, adicione as seguintes dependências no arquivo build.gradle.kts (nível raiz do projeto):

// No build.gradle.kts raiz
plugins {
    id("com.google.dagger.hilt.android") version "2.48" apply false
    id("com.squareup.anvil") version "2.4.7" apply false
}

Em seguida, no módulo da aplicação (por exemplo, app/build.gradle.kts):

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

android {
    // ... sua configuração Android
}

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") // ou kapt, se não usar KSP
}

Se você estiver usando KSP em vez de KAPT, certifique-se de que o plugin KSP esteja configurado:

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

Após sincronizar o Gradle, o Anvil estará pronto para uso.

3. Início rápido — exemplo mínimo funcional

Vamos a um exemplo simples: temos uma classe UserRepository que precisa ser injetada em MainViewModel.

Passo 1. Crie a interface ou classe que será injetada:

// UserRepository.kt
class UserRepository @Inject constructor() {
    fun getUser(): String = "João Silva"
}

Passo 2. Crie a classe que usará a dependência:

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

Passo 3. Crie um componente Hilt (ou Dagger) com o Anvil:

// AppComponent.kt
@Singleton
@Component
@MergeComponent(AppScope::class) // Anotação do Anvil
interface AppComponent {
    fun inject(app: MyApplication)
}

// AppScope.kt (definindo o escopo)
@Scope
@MustBeDocumented
annotation class AppScope

Passo 4. Registre as classes no grafo de dependências com as anotações do Anvil:

// UserRepository.kt (adicione a anotação @ContributesBinding ou @ContributesMultibinding)

Recommendations