3

好吧,让我们把这个简单化。

我创建了一个简单的库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"

我也有一些网络调用实现,我不想使用OkHttpClientfrom my-network-library。所以我在应用程序中创建了一个模块来获取我自己的OkHttpClient.

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

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

现在正在低于错误。

错误:[Dagger/DuplicateBindings] okhttp3.OkHttpClient 被绑定多次:

我知道这是因为在 中@Provides声明my-network-library,但我没有指定includes注释@ModuleBaseNetworkModule. 可以使用@Qualifier注释解决该问题,但 IMO,这将是一种解决方法。

所以我的问题是

  • includes为什么库模块的依赖项会在不使用of 的情况下进入应用程序模块@Module
  • 如何告诉 Hilt “不要在外部库中寻找 @Provides(gradle 依赖项)?” 除非我用@Module(includes = XXXModule)
4

2 回答 2

3

为什么在不使用 @Module 的情况下,来自库模块的依赖项会进入应用程序模块?

因为 Hilt 被设计为对普通的 android 开发者来说尽可能简单。

Hilt 是一个简单的家伙:他@Module @InstallIn在编译的代码中看到,他使用它。认为是@InstallIn常规includeDagger2 中的 。只是放在了不同的地方。


如何告诉 Hilt “不要在外部库中寻找 @Provides(gradle 依赖项)?” 除非我用 @Module(includes = XXXModule) 标记模块

不可能。您不必将其标记为@Module @InstallIn(...).

一般来说,我很难理解你为什么想要那个。您如何在 中使用 Hilt 功能my-network-library?它是不同应用程序之间的共享模块吗?您想在其中一些应用程序中包含该模块,但不是全部?

于 2020-08-07T08:42:35.193 回答
0

您是否尝试使用 qualifier ?

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class MyOkHttpClient

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

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

您可以通过这种方式分离 OkHttpClients 并继续利用 hilt。

于 2020-10-20T16:09:31.750 回答