Injeção de dependência no Android com Hilt

Tempo de leitura: 4 minutes

A injeção de dependência (DI) é uma técnica amplamente usada em programação e adequada ao desenvolvimento do Android, em que as dependências são fornecidas a uma classe em vez de serem elas próprias. Seguindo os princípios de DI, você cria as bases para uma boa arquitetura de aplicativos, maior reutilização de código e facilidade de teste. Você já tentou a injeção manual de dependência no seu aplicativo? Mesmo com muitas das bibliotecas de injeção de dependência existentes atualmente, isso requer muito código padrão à medida que seu projeto se torna maior, pois você precisa construir todas as classes e suas dependências manualmente e criar contêineres para reutilizar e gerenciar dependências.

Seguindo os princípios de DI, você cria as bases para uma boa arquitetura de aplicativos, maior reutilização de código e facilidade de teste.

A nova biblioteca Hilt define uma maneira padrão de realizar DI em seu aplicativo, fornecendo contêineres para todas as classes do Android em seu projeto e gerenciando seus ciclos de vida automaticamente para você. No momento, o Hilt está em alfa, experimente-o no seu aplicativo e nos envie um feedback usando este link.

O Hilt é construído sobre a popular biblioteca de DI Dagger, então se beneficia da correção do tempo de compilação, desempenho do tempo de execução, escalabilidade e suporte do Android Studio que o Dagger fornece. Por esse motivo, Dagger teve uma ótima adoção em 74% dos 10 mil aplicativos mais populares da Google Play Store. No entanto, devido à geração do código de tempo de compilação, espere um aumento no tempo de construção.

Como muitas classes de estrutura do Android são instanciadas pelo próprio sistema operacional, há um clichê associado ao usar o Dagger em aplicativos Android. Ao contrário do Dagger, o Hilt é integrado às bibliotecas Jetpack e às classes de estrutura do Android e remove a maior parte desse clichê para permitir que você se concentre apenas nas partes importantes da definição e injeção de ligações sem se preocupar em gerenciar toda a instalação e fiação do Dagger. Ele gera e fornece automaticamente:

  • Componentes para integrar classes de estrutura do Android com o Dagger que você precisaria criar manualmente.
  • Anotações de escopo para os componentes que o Hilt gera automaticamente.
  • Ligações e qualificadores predefinidos.

O melhor de tudo é que, como Dagger e Hilt podem coexistir juntos, os aplicativos podem ser migrados conforme a necessidade.

Hilt em ação

Apenas para mostrar o quão fácil é o uso do Hilt, vamos realizar uma DI rápida em um aplicativo Android típico. Vamos fazer com que a Hilt injete um AnalyticsAdapter em nossa MainActivity.

Primeiro, ative o Hilt no seu aplicativo anotando sua classe de aplicativo com o @HiltAndroidApp para acionar a geração de código do Hilt:

@HiltAndroidApp
class MyApplication : Application() { ... }

Segundo, informe à Hilt como fornecer instâncias do AnalyticsAdapter anotando seu construtor com @Inject:

class AnalyticsAdapter @Inject constructor() { ... }

Terceiro, para injetar uma instância do AnalyticsAdapter no MainActivity, habilite o Hilt na atividade com a anotação @AndroidEntryPoint e execute a injeção de campo usando a anotação @Inject:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
  @Inject lateinit var analytics: AnalyticsAdapter
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // analytics instance has been populated by Hilt
    // and it's ready to be used
  }
}

Para mais informações, você pode verificar facilmente o que as novas anotações fazem na seção de dicas abaixo.

Vem com suporte a Jetpack!

Você pode usar suas bibliotecas favoritas do Jetpack com o Hilt pronto para uso. Estamos fornecendo suporte direto à injeção para o ViewModel e WorkManager nesta versão.

Por exemplo, para injetar um ViewModel LoginViewModel de componentes de arquitetura em um LoginActivity: anote LoginViewModel com @ViewModelInject e use-o na atividade ou fragmento conforme o esperado:

class LoginViewModel @ViewModelInject constructor(
  private val analyticsAdapter: AnalyticsAdapter
): ViewModel { ... }
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
  private val loginViewModel: LoginViewModel by viewModels()
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // loginViewModel is ready to be used
  }
}

Saiba mais sobre o suporte ao Jetpack nos documentos.

Comece a usar o Hilt

Se você está intrigado com a Hilt e deseja saber mais sobre isso, aqui estão alguns recursos para você aprender da maneira que preferir:

Introdução ao Hilt

Aprenda a adicionar o Hilt no seu aplicativo Android com este guia.

Documentação

Se você é novo no DI ou no Dagger, consulte nosso guia para adicionar o Hilt a um aplicativo Android. Como alternativa, se você já conhece o Dagger, também estamos fornecendo documentação em dagger.dev.

Se você está apenas curioso sobre as novas anotações e o que pode fazer com o Hilt, confira esta folha de dicas na seção abaixo.

Para usuários do Dagger

Se você já usa o Dagger ou o dagger.android em seu aplicativo, consulte este guia de migração ou o codelab mencionado abaixo para ajudá-lo a mudar para o Hilt. Como Dagger e Hilt podem coexistir juntos, você pode migrar seu aplicativo de forma incremental.

Codelabs

Para aprender o Hilt em uma abordagem passo a passo, acabamos de lançar dois codelabs:

Código de amostra

Deseja ver como o Hilt é usado em aplicativos existentes? Vá verificar seu uso no aplicativo Google I/O 2020 e na ramificação dev-hilt do repositório Github de amostras de arquitetura do Android.

Comentários

No momento, o Hilt está em alfa, experimente-o no seu aplicativo e nos envie um feedback usando este link.

Folha de dicas

Esta folha de dicas permite que você veja rapidamente o que as diferentes anotações de Hilt e Dagger fazem e como usá-las.

Faça o download da folha de dicas em PDF