Dicas sobre o processo de migração do Dagger 2 para o Dagger Hilt
No processo de migração utilizando o projeto da FreteBras, me deparei com detalhes que antes funcionavam com o Dagger 2 e agora não funcionam com o Dagger Hilt… A parte boa é que o log de erro do Hilt é muito bom e facilita bastante.
Erro ao prover uma dependência (Missing Binding)
Quando estava definindo em qual componente aplicar o módulo dei preferência pelos componentes mais específicos, por exemplo, o @InstallIn(ViewModelComponent::class)
, entretanto em alguns casos obtive o erro [Dagger/MissingBinding]
.
Analisando o log de erro verifiquei que precisava prover a dependência em um componente mais abrangente, como por exemplo o @InstallIn(ActivityComponent::class)
.
O erro Missing Binding
é mais comum quando não se tem um módulo provendo determinada dependência, entretanto, não era meu caso, pois o projeto estava funcionando perfeitamente antes da migração.
Mais de um módulo provendo a mesma dependência (Duplicate Bindings)
Com o Dagger 2 não tinhamos este problema, pois os módulos eram vinculados a estrutura de injeção da Activity
e Fragment
.
Como no Dagger Hilt não temos a classe ActivityBuilder
do exemplo acima, precisamos criar anotações que permitam prover a mesma interface com implementações diferentes que (Multiple Bindings).
No caso do projeto da FreteBras, em alguns casos, decidi manter apenas um dos módulos, pois as implementações eram idênticas.
Módulos utilizando design partner MVP (Model-View-Presenter)
Durante a migração me deparei com o erro MissingBinding
em um módulo que utilizava o design partner MVP, sim, o mesmo erro apresentado anteriormente.
Infelizmente ao analisar o problema percebi que eram problemas distintos. Este erro acontecia por que o Dagger Hilt não conseguia prover a interface da view para o presenter.
Em uma busca rápida na internet me deparei com um post no stakoverflow que sugeria uma alteração simples, mas que não me deixou um pouco desconfortável, pois exigia forçar um cast da Activity
base para a Activity
que implementa a interface.
Como o projeto da FreteBras tem poucos módulos utilizando o design partner MVP, resolvi instanciar o presenter diretamente na Activity
ou Fragment
. Talvez esta não seja a melhor solução, mas já consegui de forma simples não forçar o cast apresentado anteriormente.
Mas, caso a solução anterior não seja o ideal para o seu projeto, você pode fazer uma implementação utilizando injeção de dependência assistida.
E aí, gostou das dicas? Comente!
Obrigado por ler! Se você gostou do artigo, dê um clap 👏.