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)
Também na biblioteca
Autorização e Autenticação em TypeScript: Guia Completo
Cache em TypeScript: Redis, Memcached e soluções in-memory
Hibernate ORM: Ferramenta poderosa para trabalhar com bancos de dados em Java
Parsing de HTML em Go (Golang): bibliotecas e exemplos de código
Processamento JSON em C++: bibliotecas, parsing e serialização de dados