【发布时间】:2020-08-06 04:31:44
【问题描述】:
好的,让我们把这个简单点。
我创建了一个名为my-network-library 的简单库,其中包含两个类。第一个是名为 BaseNetworkModule 的 Hilt 模块
@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"
我也有一些网络调用实现,我不想使用来自my-network-library 的OkHttpClient。所以我在应用程序中创建了一个模块来获取我自己的OkHttpClient 实例。
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
// CUSTOM CONFIG GOES HERE
.build()
}
}
现在出现以下错误。
错误:[Dagger/DuplicateBindings] okhttp3.OkHttpClient 已绑定 多次:
我知道这是因为my-network-library 中声明了@Provides,但我没有将includes 指定给@Module 注释以从BaseNetworkModule 继承依赖关系。可以使用 @Qualifier 注释解决此问题,但 IMO,这将是一种解决方法。
所以我的问题是
- 为什么在不使用
includes的@Module的情况下,来自库模块的依赖项会进入应用模块? - 如何告诉 Hilt “不要在外部库中查找 @Provides(gradle 依赖项)?”除非我用
@Module(includes = XXXModule)标记模块
【问题讨论】:
-
This 可能会有所帮助。
-
用匕首,它工作正常。要继承依赖关系,我们必须手动使用
@Module注释的includes选项。但是有了hilt,我不知道为什么它默认包含代码库中的所有依赖项。 -
你应该在模块中使用标记为
internal的限定符,这样它就不会泄漏到外面 -
@EpicPandaForce 创建类
internal将完全阻止从应用程序访问它。我希望可以通过includes访问该类以维护模块继承。 -
可以使用命名注解
标签: android dependency-injection dagger-2 dagger dagger-hilt