好吧,让我们把这个简单化。
我创建了一个名为my-network-library
的简单库,其中包含两个类。第一个是名为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"
我也有一些网络调用实现,我不想使用my-network-library
的OkHttpClient
。所以我在应用程序中创建了一个模块来获取我自己的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 已绑定 多次:
我知道这是因为my-network-library
中声明的@Provides
,但我没有指定includes
@Module
注释从BaseNetworkModule
继承依赖关系。可以使用@Qualifier
注释解决此问题,但IMO,这将是一种解决方法。
所以我的问题是
- 为什么库模块的依赖项进入应用程序模块而不使用
@Module
includes
? - 如何告诉 Hilt "不要在外部库中查找@Provides(gradle 依赖项)?"除非我用
@Module(includes = XXXModule)
标记模块
为什么库模块的依赖项进入应用程序模块而不使用包含@Module?
因为Hilt的设计对于普通的Android开发人员来说尽可能简单。
希尔特是一个简单的家伙:他在编译的代码中看到@Module @InstallIn
,他使用它。@InstallIn
可以想象成常规dagger2中的include
。只是放在不同的位置。
如何告诉 Hilt "不要在外部库中查找@Provides(gradle 依赖项)?"除非我用 @Module(include = XXXModule) 标记模块
不可能。您不必用@Module @InstallIn(...)
标记它。
总的来说,我很难理解你为什么想要那个。您如何在my-network-library
中使用希尔特功能?它是不同应用程序之间的共享模块吗?您想将模块包含在其中一些应用程序中,但不是全部?
您是否尝试使用限定符?
@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()
}
}
您可以通过这种方式分离OkHttpClient,并继续利用剑柄的优势。