Migrar do Dagger2 para o Hilt em um projeto multimódulo
Um guia passo a passo para migrar de Dagger
para Hilt
um projeto de vários módulos.
Estrutura do Projeto
Para visualizar o projeto, ele contém vários módulos NetworkModule, StorageModule, CommonModule, FeatureModule etc. Em projetos reais, pode haver muito mais módulos, mas estamos limitando os seguintes módulos.

Estratégia de Migração
Queremos migrar totalmente Dagger
para, Hilt
mas na prática precisamos de uma abordagem incremental onde primeiro migraremos nosso app
projeto para Hilt
e depois outros módulos, ou seja, Dagger
e Hilt
devemos trabalhar em paralelo por algum tempo até que a migração completa seja concluída.
Versões
Esta história fará uma migração de Dagger 2.24
para Hilt 2.45
.
Contente
- Configuração/Preparação
- Migrar componente de aplicativo e singleton
- Migrar classe de aplicativo
- Migrar classe de atividade
- Migrar fragmento
- Migrar ViewModel
- Limpeza pós-migração
- Resumo e conclusões
Para integrar, adicione as seguintes dependências ao arquivo Hilt
do aplicativo Gradlebuild.gradle
Configure também kapt
para definir correctErrorType como true
no build.gradle
arquivo
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
Migrar componente de aplicativo
O Dagger Singleton
Component
inclui todos os módulos do Dagger criados no aplicativo ou outros módulos do projeto e isso normalmente é feito na AppComponent
classe criada para Dagger
.
Vamos ver o arquivo AppComponent.kt atual
Para migrar, Singleton
Component
precisamos instalar cada módulo, por exemplo, NetworkModule , StorageModule etc em SingletonComponent
for Hilt
, você pode fazer isso anotando todos esses módulos individuais com @InstallIn(SingletonComponent::class)
Mas se você tiver muitos módulos mudar todos eles de uma vez não será uma boa idéia, mas você pode crie um AggregatedModule que será anotado com @InstallIn(SingletonComponent::class)
e inclua todos esses Dagger
módulos anotados com @Module(includes = [ <all of these modules > ])
.
Execute o projeto, ele gerará um erro
Erro DisableModuleHasInstallInCheck
Depois de executar, o projeto Hilt
tentará encontrar @InstallIn
a anotação para cada módulo incluído no AggregatedModule
anotado com @Module
. Hilt
gerará um erro se encontrar um módulo que não esteja anotado com @Install
Como não anotamos todos os módulos @InstallIn
porque estamos no meio da migração, podemos desativar esse erro usando o seguinte sinalizador
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
você pode especificar no nível do aplicativo build.gradle
conforme abaixo, mas devemos remover esse sinalizador assim que toda a migração for concluída.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Migrar classe de aplicativo
Para adicionar o Hilt ao aplicativo, vamos anotar a Application
classe com @HiltAndroidApp
. Você deve remover @Component
e @Component.Builder
quais estavam presentes na AppComponent
aula conforme mencionado acima.
Se você Application
estende DaggerApplication
ou implementa, HasAndroidInjector
ainda precisa manter algum código conforme mostrado abaixo em ambos os casos. Isso é para oferecer suporte a ambos Dagger
e Hilt
em paralelo até que toda a migração seja concluída.
Se suas Application
extensões de DaggerApplication
sua classe de aplicativo se parecerem com isso.
E se seus Application
implementos HasAndroidInjector
, então seu aplicativo deve se parecer com isso
Depois que toda a migração for concluída, você precisará remover esse código de sua Application
classe e sua Application
aparência ficará como abaixo. (Mas esse seria um dos últimos passos, por favor não o faça agora)
Execute o projeto, ele deve construir seu projeto com sucesso e o aplicativo deve ser iniciado sem exceções de tempo de execução.
Migrar classe de atividade
O Dagger fornece @ContributesAndroidInjector
para especificar qualquer Activity/Fragment como colaborador do Android Injector, em nosso projeto feito em MainActivityModule
, um dos módulos incluídos emAggregatedModule
MainActivityModule
parece com isso antes da migração
MainActivity
parece com isso antes da migração
Para migrar nosso MainActivity
para Hilt
, nos livraremos completamente da MainActivityModule
classe do módulo e adicionaremos a anotação @AndroidEntryPoint
para MainActivity
. Como o nosso MainActivity
também está se estendendo, DaggerAppCompatActivity
precisamos estender nossa atividade do correspondente, AppCompatActivity
então, após a migração, nosso MainActivity
ficará como abaixo.
Execute seu projeto, ele deve ser bem-sucedido com MainActivity
a migração para Hilt
Migrar Fragment/View/BroadcastReceiver
A migração de qualquer fragmento Hilt
será feita com as mesmas etapas que fizemos para migrar MainActivity
para o Hilt. As etapas estão abaixo
- Remova o código onde você está anotando seu Fragment com
@ContributesAndroidInjector
a probabilidade de ser um módulo - Remova o módulo do
SingletonComponent
qual estava lidando@ContributesAndroidInjector
com o seu fragmento - Anote seu fragmento com
@AndroidEntryPoint
- se o seu fragmento for estendido,
DaggerFragment
então você precisa estender seu fragmento daFragment
classe
Migrar ViewModel
A migração do ViewModel requer algumas etapas.
Em primeiro lugar, anote seu viewModel com@HiltViewModel
Para ser FeatureViewModel
injetado, Hilt
usaremos a extensão de fragmento viewModels()
fornecida na dependência de extensão de fragmento que adicionaremos no build.gradle
arquivo correspondente conforme abaixo
implementation "androidx.fragment:fragment-ktx:1.5.6"
Agora remova os correspondentes @Bind
e @IntoMap
as @ViewModelKey
ligações para FeatureViewModel
as quais usamos para Dagger.
Na adaga para injetar um ViewModel, também teríamos lateinit var
propriedades que estarão injected
em tempo de execução usando algumas ViewModelFactory
que também não são mais necessárias ViewModelModule
, então você pode excluir ViewModelProviderFactory
e o código relacionado se não houver outro ViewModel/Fragmento ainda na Dagger.
Execute seu projeto, ele deve ser bem-sucedido com Fragment and ViewModel
a migração para Hilt
Migrar outros módulos.
Até agora estávamos migrando // Components
no módulo app. Mas temos que migrar outros módulos agora. Iremos um módulo por vez e migraremos totalmente para o Hilt usando as etapas a seguirModules
Activity
Fragment
- Adicionar
Hilt
dependência nobuild.gradle
arquivo do módulo - Anote cada um
@Module
com@InstallIn
anotação. - Remova
@JvmStatic
a anotação para cada@Provide
anotação, se tiver, porque não é mais necessária emHilt
- Anote seu
Fragment
/Activity
com@AndroidEntryPoint
e remova o correspondente@ContributesAndroidInjector
- Migre sua anotação de ViewModels
@HiltViewModel
e use a extensão de fragmentoviewModels()
para injetar esses modelos de exibição - Continue removendo todos os módulos que não serão mais necessários em
AggregatedModule
.AggregatedModule
criamos acima em nossa primeira etapa.
Depois que cada módulo do projeto é migrado para Hilt
. Precisa de tempo de limpeza
- Remova disableModuleInstallInCheck = true, que adicionamos no início no nível do aplicativo ou qualquer outro
build.gradle
e removendo@DisableInstallInCheck
a anotação se foi adicionada a qualquer@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Remova todas as Dagger
dependências em todos os seus módulos.
Execute seu projeto, ele deve ser executado com sucesso, seu projeto foi totalmente migrado para Hilt
Resumo e conclusões
A visão geral de alto nível das alterações de código após a migração ficará assim
- Todas as anotações de código
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
seriam removidas - Todos os seus ViewModels devem ser anotados com
@HiltViewModel
- Todas as
@Module
classes devem ser anotadas com@InstallIn
anotação - Fragments/Activities/View/Service devem ser anotados com
@AndroidEntryPoint
- A classe de aplicativo deve ser anotada com
@HiltAndroidApp
AppComponent
e o código relacionado deve ser removido@JvmStatic
as anotações dentro dos módulos do Hilt não devem mais existir
- Injeção de dependência usando Hilt
- Migrar para a documentação oficial do Hilt
Lembre-se de seguir e se gostou :)
— — — — — — — — — — —
GitHub | Linkedin | Twitter
Codificação de nível
Obrigado por fazer parte da nossa comunidade! Antes de você ir:
- Bata palmas para a história e siga o autor
- Veja mais conteúdo na publicação Level Up Coding
- Curso gratuito de entrevista de codificação ⇒ Veja o curso
- Siga-nos: Twitter | Linkedin | Boletim de Notícias