如何防止希尔特从库中选择依赖项?



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

我创建了一个名为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-libraryOkHttpClient。所以我在应用程序中创建了一个模块来获取我自己的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,这将是一种解决方法。

所以我的问题是

  • 为什么库模块的依赖项进入应用程序模块而不使用@Moduleincludes
  • 如何告诉 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,并继续利用剑柄的优势。

最新更新