Sobes.tech
Middle+

Como fornecer diferentes instâncias da mesma classe no Dagger Hilt?

sobes.tech IA

Resposta da IA

Para fornecer diferentes instâncias da mesma classe no Dagger Hilt, pode usar qualificadores (@Named ou personalizados).

  1. Criação de qualificadores:

    • Use @Named para casos simples, indicando um nome de string.
    • Crie suas próprias anotações de qualificadores personalizados para cenários mais complexos ou melhor semântica.
    // Exemplo de qualificador personalizado
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Ligação de diferentes instâncias usando qualificadores:

    • Em módulos Hilt (@Module), dentro de classes com @Provides ou @Binds, use anotações de qualificadores em métodos que retornam instâncias.
    @Module
    @InstallIn(SingletonComponent::class) // Exemplo de escopo
    object AppModule {
    
        @Provides
        @Singleton // Exemplo de escopo
        @Named("개발") // Qualificador @Named para a instância "Para desenvolvimento"
        fun provideDevRepository(): Repository {
            return Repository("개발 환경") // Instância ou configuração diferente
        }
    
        @Provides
        @Singleton // Exemplo de escopo
        @Named("운영") // Qualificador @Named para a instância "Para produção"
        fun provideProdRepository(): Repository {
            return Repository("운영 환경") // Instância ou configuração diferente
        }
    
        // Uso de qualificadores personalizados
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint de API de produção")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint de API de teste")
        }
    }
    
  3. Injeção de instância específica:

    • Nos locais onde é necessário injetar a dependência (@AndroidEntryPoint), anote o campo ou parâmetro do construtor com o qualificador correspondente.
    @AndroidEntryPoint // Por exemplo, Fragment ou Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Injetar a instância "Para desenvolvimento"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Injetar a instância "Para produção"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Injetar a instância para produção com qualificadores personalizados
        lateinit var productionService: MyService
    
        // ... uso das dependências ...
    }