如何防止 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,这是一种解决方法。

所以我的问题是

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。