如何防止 Hilt 从库中选择依赖项?
How to prevent Hilt from picking dependency from a library?
好吧,让我们简单点。
我创建了一个名为 my-network-library
的简单库,其中包含两个 classes。第一个是名为 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。
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 is bound
multiple times:
我知道是因为在my-network-library
中声明了@Provides
,但是我没有在@Module
注解中指定includes
来继承对[=的依赖15=]。使用 @Qualifier
注释可能会解决此问题,但 IMO,这是一种解决方法。
所以我的问题是
- 为什么不使用
@Module
的 includes
就可以从库模块进入应用程序模块?
- 如何告诉 Hilt“不要在外部库(gradle 依赖项)中查找 @Provides?”除非我用
@Module(includes = XXXModule)
标记模块
Why dependency from a library module comes into the app module without using includes of @Module?
因为 Hilt 的设计目的是让常规 android 开发人员尽可能简单。
Hilt 是一个简单的家伙:他在编译代码中看到 @Module @InstallIn
,他使用它。将 @InstallIn
视为常规 Dagger2 中的 include
。只是放在了不同的地方。
How to tell Hilt "Do not look for @Provides in external libraries (gradle dependencies) ?" unless I mark the module with @Module(includes = XXXModule)
不可能。你不必用 @Module @InstallIn(...)
.
标记它
总的来说,我很难理解您为什么想要它。您如何使用 my-network-library
中的 Hilt 功能?它是不同应用程序之间的共享模块吗?您想将模块包含在其中一些应用程序中,而不是所有应用程序中?
您是否尝试使用限定符?
@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。
好吧,让我们简单点。
我创建了一个名为 my-network-library
的简单库,其中包含两个 classes。第一个是名为 BaseNetworkModule
@Module
@InstallIn(ApplicationComponent::class)
object BaseNetworkModule {
// Client
@Singleton
@Provides
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
// my default okhttp setup goes here
.build()
}
}
第二个是简单的 class。
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 is bound multiple times:
我知道是因为在my-network-library
中声明了@Provides
,但是我没有在@Module
注解中指定includes
来继承对[=的依赖15=]。使用 @Qualifier
注释可能会解决此问题,但 IMO,这是一种解决方法。
所以我的问题是
- 为什么不使用
@Module
的includes
就可以从库模块进入应用程序模块? - 如何告诉 Hilt“不要在外部库(gradle 依赖项)中查找 @Provides?”除非我用
@Module(includes = XXXModule)
标记模块
Why dependency from a library module comes into the app module without using includes of @Module?
因为 Hilt 的设计目的是让常规 android 开发人员尽可能简单。
Hilt 是一个简单的家伙:他在编译代码中看到 @Module @InstallIn
,他使用它。将 @InstallIn
视为常规 Dagger2 中的 include
。只是放在了不同的地方。
How to tell Hilt "Do not look for @Provides in external libraries (gradle dependencies) ?" unless I mark the module with @Module(includes = XXXModule)
不可能。你不必用 @Module @InstallIn(...)
.
总的来说,我很难理解您为什么想要它。您如何使用 my-network-library
中的 Hilt 功能?它是不同应用程序之间的共享模块吗?您想将模块包含在其中一些应用程序中,而不是所有应用程序中?
您是否尝试使用限定符?
@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。