Ainda no Dagger 2? Que tal migrar para o Dagger Hilt?

Vinícius Alves Mello
Fretebras Tech
Published in
4 min readMar 29, 2021

Apreenda de forma simples como migrar seu projeto Dagger 2 (Dagger Android) para Dagger Hilt.

Por que migrar para o Dagger Hilt?

Existem diversos artigos falando sobre as vantagens e benefícios de utilizar o Dagger Hilt, inclusive no site oficial.

Dentre as diversas vantagens e benefícios, trago aqueles que considero mais importantes:

Quem nunca perdeu um tempão tentando resolver um problema de injeção do Dagger 2?! 😬

Prova de Conceito (PoC) no Projeto da FreteBras

Para validar se era possível migrar um projeto real do Dagger 2 para o Dagger Hilt foi proposto um desafio dentro do time, e ao final de todas alterações no projeto tivemos 1403 linhas adicionadas e 4989 linhas removidas, conforme imagem abaixo.

Infelizmente não poderemos demonstrar o código da FreteBras, mas utilizaremos um projeto similar que está disponível no meu github. Neste saímos da versão 1.1.0 para a versão 2.0.0 e com as alterações referentes à migração do Dagger 2 para o Dagger Hilt tivemos 160 linhas adicionadas e 471 linhas removidas, conforme imagem abaixo.

Em ambos os casos tivemos uma diminuição considerável no número de linhas do projeto. Logicamente esta é uma métrica muito rasa e durante o passo a passo da migração você vai poder tirar suas próprias conclusões.

Passo a passo da migração

Substituir dependências

Remova as dependências do Dagger 2 de todos arquivos build.gradle do projeto.

No arquivo build.gradle da raiz do projeto adicione o plugin do Dagger Hilt.

Nos mesmos arquivos que removeu as dependências do Dagger 2, adicione as dependências do Dagger Hilt.

Alterar Application

Alterar o DaggerApplication para a anotação @HiltAndroidApp, conforme antes e depois abaixo.

Antes:

Depois:

Remover arquivos

Uma das vantagens do Dagger Hilt é que ele elimina a necessidade de criar vários arquivos no projeto, conforme veremos a seguir.

Remover arquivos compartilhados entre todos os módulos.

https://github.com/viniciusalvesmello/RestaurantGuideCoroutinesFlow/tree/1.1.0/shared/src/main/java/io/github/viniciusalvesmello/restaurant/guide/coroutines/shared/injection

Remover arquivos de construção da árvore de dependências da Activity ou Fragment.

Remover arquivos de construção da árvore de dependências da ViewModel.

Remover os componentes de construção da árvore de dependências da aplicação.

Alterar Módulos

Devido à exclusão dos componentes de construção da árvore de dependências da aplicação, precisamos utilizar os componentes padrões do Dagger Hilt, conforme imagem abaixo. Você pode criar componentes customizados, mas não os abordaremos neste artigo.

https://dagger.dev/hilt/components

Olhando para a imagem acima o primeiro passo é definir em qual componente você deseja injetar o seu módulo. Uma dica seria dar preferência por módulos mais abaixo da hierarquia. No projeto de exemplo, nas injeções do módulo app eu utilizei o SingletonComponent, enquanto, nos módulos cities e restaurants utilizei o ViewModelComponent, principalmente por estar utilizando o design partner MVVM (Model-View-ViewModel).

A partir da decisão de qual módulo utilizar, incluímos a anotação @InstallIn na classe do módulo.

Caso seu módulo utilize alguma anotação para injetar o contexto da aplicação (No projeto de exemplo utilizava a anotação @ApplicationQualifier), altere para @ApplicationContext.

Alterar ViewModel

Inclua a anotação @HiltViewModel, sim, somente isto.

Alterar View (Activity, Fragment, etc)

Adicione a anotação @AndroidEntryPoint, lembrando que ela pode ser utilizadas em outros locais, conforme documentação.

Para simplificar o processo de instanciar a ViewModel, vamos utilizar uma dependência do Android KTX (Conjunto de extensões Kotlin), logo adicione a dependência android.fragment:fragment-ktx ou android.navigation:navigation-fragment-ktx (Caso esteja utilizando o Navigation do Jetpack) no arquivo build.gradle do módulo que vai instanciar a ViewModel.

Antes com Dagger 2 era necessário utilizar a classeViewModelFactory para prover a instância da ViewModel.

Com o Dagger Hilt e a dependência do Android KTX, podemos instanciar a ViewModel com apenas by viewModels().

Caso não queira utilizar a dependência do Android KTX, a forma de instanciar a ViewModel fica um pouco mais verboso.

Obrigado por chegar até aqui!

Agora que você chegou até aqui, ficou com alguma dúvida? Caso tenha, sinta-se a vontade para enviá-las nos comentários ou em minhas redes sociais.

Quer mais artigos como esse? Então me acompanhe por aqui, pois em breve publicarei um artigo onde relato problemas e soluções a respeito do processo de migração do Dagger 2 para o Dagger Hilt no projeto da FreteBras.

Se você chegou aqui agora, a segunda parte já esta disponível aqui.

Dica de Links

E aí, você já usa o Dagger Hilt? Comente!

Obrigado por ler! Se você gostou do artigo, dê um clap 👏.

--

--