Sobes.tech
Middle+

Fale sobre as anotações Dagger @Provides e @Binds

sobes.tech IA

Resposta da IA

A anotação @Provides é usada em módulos para definir métodos que criam instâncias de dependências. Esses métodos são marcados com @Provides e retornam o tipo de dependência que fornecem. No corpo do método, encontra-se a lógica para criar a instância.

@Module
class AppModule {

    @Provides
    fun provideDatabase(context: Context): AppDatabase {
        // Lógica para criar a base de dados
        return Room.databaseBuilder(context, AppDatabase::class.java, "app-database").build()
    }
}

A anotação @Binds é usada em módulos para indicar que uma interface está vinculada a uma implementação concreta. Aplica-se a métodos abstratos que tomam como parâmetro a implementação e retornam a interface. O Dagger gera um código mais eficiente para @Binds em comparação com @Provides, pois não requer a chamada de um método para criar a instância.

@Module
interface AppBindsModule {

    @Binds
    fun bindRepository(impl: DefaultRepository): Repository
}

interface Repository { /* ... */ }
class DefaultRepository @Inject constructor(): Repository { /* ... */ }

Diferença principal:

  • @Provides é usado para criar instâncias de objetos, muitas vezes com lógica mais complexa ou dependências.
  • @Binds é usado para vincular tipos abstratos (interfaces) às suas implementações concretas, o que é mais eficiente na ausência de lógica complexa de criação.