Как запретить Hilt выбирать зависимости из библиотеки? - PullRequest
2 голосов
/ 06 августа 2020

Хорошо, давайте сделаем это просто.

Я создал простую библиотеку под названием my-network-library с двумя классами. Первый - это модуль Hilt под названием BaseNetworkModule

@Module
@InstallIn(ApplicationComponent::class)
object BaseNetworkModule {

    // Client
    @Singleton
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
            // my default okhttp setup goes here 
            .build()
    }
}

, а второй - простой класс.

class MyAwesomeClass {
    fun doMagic() {
        // magic code goes here
    }
}

Теперь я хочу использовать MyAwesomeClass в одном из своих приложений. . Поэтому я добавил зависимость в приложение.

implementation "com.theapache64:my-awesome-library-1.0.0"

У меня также есть реализация сетевых вызовов, и я не хочу использовать OkHttpClient из my-network-library. Итак, я создал модуль в приложении, чтобы получить свой собственный экземпляр OkHttpClient.

@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {

    @Singleton
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
            // CUSTOM CONFIG GOES HERE 
            .build()
    }
}

Теперь я получаю ошибку ниже.

error: [Dagger / DuplicateBindings ] okhttp3.OkHttpClient привязывается несколько раз:

Я знаю, что это из-за @Provides, объявленного в my-network-library, но я не указал includes в аннотации @Module к наследовать зависимость от BaseNetworkModule. Проблема может быть исправлена ​​с использованием аннотации @Qualifier, но, IMO, это было бы обходным путем.

, поэтому мой вопрос:

  • Почему зависимость от библиотечного модуля входит в приложение модуль без использования includes из @Module?
  • Как сказать Hilt: «Не искать @Provides во внешних библиотеках (зависимости Gradle)?» если я не отмечу модуль @Module(includes = XXXModule)

1 Ответ

2 голосов
/ 07 августа 2020

Почему зависимость от библиотечного модуля входит в модуль приложения без использования включений @Module? .

Хилт простой чувак: видит @Module @InstallIn в скомпилированном коде, он его использует. Думайте о @InstallIn как о include в обычном Dagger2. Просто поместили в другое место.

Как сказать Хилту: «Не искать @Provides во внешних библиотеках (зависимости Gradle)?» если я не помечу модуль с помощью @Module (includes = XXXModule)

Невозможно. Вам не нужно отмечать это @Module @InstallIn(...).

В общем, у меня проблемы с пониманием, зачем вам это нужно. Как вы используете функции Hilt в my-network-library? Это общий модуль для разных приложений? И вы хотите включить модуль в некоторые из этих приложений, но не во все?

...