多个模块引用核心模块的 Android 刀柄注入周期错误

Android hilt injection cycle error with multiple modules referencing a core module

提问人:Morten Holmgaard 提问时间:11/10/2023 更新时间:11/10/2023 访问量:51

问:

我们目前有 3 个模块:App、Api 和 Core。
应用依赖于 API 和 Core。
Api 依赖于 Core。

在核心模块中,我们有一个 VersionProvider:

class VersionProvider @Inject constructor(@ApplicationContext context: Context) {
    val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName

    val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        context.packageManager.getPackageInfo(context.packageName, 0).longVersionCode
    } else {
        @Suppress("DEPRECATION")
        context.packageManager.getPackageInfo(context.packageName, 0).versionCode
    }
}

它被注入到类中,包括 Api 模块和 App 模块。

核心模块 hilt 模块定义如下:

@Module
@InstallIn(SingletonComponent::class)
abstract class CoreModule {

    @Singleton
    @Binds
    abstract fun bindVersionProvider(
        provider: VersionProvider
    ): VersionProvider
}

编译时,我们收到以下错误:

C:\Code\xxx\app\build\generated\hilt\component_sources\development\com\xxx\App_HiltComponents.java:200: 错误:[Dagger/DependencyCycle] 找到依赖项周期:公共 抽象静态类 SingletonC 实现App_GeneratedInjector, ^ com.xxx.core.VersionProvider 注入到 com.xxx.core.hilt.CoreModule.bindVersionProvider(提供程序) com.xxx.core.VersionProvider 注入到 com.xxx.core.hilt.CoreModule.bindVersionProvider(提供程序) ... 通过以下方式请求循环: com.xxx.core.VersionProvider 注入到 com.xxx.api.core.hilt.ApiClientModule.bindNetworkManager( , versionProvider) com.xxx.api.services.helpers.INetworkManager 被注入到 com.xxx.api.core.hilt.ApiClientModule.bindInventoryApi(networkManager) com.xxx.api.services.inventory.InventoryApi 注入 com.xxx.api.services.inventory.InventoryService(api, ) com.xxx.api.services.inventory.InventoryService 注入于 com.xxx.api.core.hilt.ServiceModule.bindInventoryService(服务) com.xxx.api.services.inventory.IInventoryService 注入于 com.xxx.managers.inventory.InventoryManager(inventoryService, ) com.xxx.managers.inventory.InventoryManager 被注入到 com.xxx.core.hilt.ManagerModule.bindInventoryManager(经理) com.xxx.managers.inventory.IInventoryManager 注入于 com.xxx.App.inventoryManager com.xxx.App 注射 com.xxx.App_GeneratedInjector.injectApp(com.xxx.App) 以下其他入口点也依赖于它: dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.xxx.App_HiltComponents.SingletonC ? com.xxx.App_HiltComponents.ActivityRetainedC ? com.xxx.App_HiltComponents.ViewModelC] 1 错误

在 App 和 API 模块中,Hilt 模块以相同的方式定义,例如:

@Module
@InstallIn(SingletonComponent::class)
object ApiClientModule {
    @Provides
    @Singleton
    fun bindNetworkManager(
        settings: ISettings,
        versionProvider: VersionProvider
    ): INetworkManager {
        return NetworkManager(settings, versionProvider)
    }
...
}

我认为问题与以下事实有关:VersionProvider 以某种方式在 Hilt 容器中注册了多次,因为它同时从 App 和 Api 模块引用。
但我不知道我缺少什么 Hilt 配置来使其工作。
有什么线索吗?

Android Kotlin 依赖注入 匕首-刀柄

评论


答:

2赞 JanItor 11/10/2023 #1

我认为依赖循环发生在 .尝试删除此内容:CoreModule

    @Singleton
    @Binds
    abstract fun bindVersionProvider(
        provider: VersionProvider
    ): VersionProvider

并用 .VersionProvider@Singleton

评论

0赞 Morten Holmgaard 11/10/2023
有了它,我收到一个KSP错误:任务':api:kspDevelopmentKotlin'执行失败。执行 org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction 时发生故障,ArrayIndexOutOfBoundsException:数组索引超出范围:0
0赞 JanItor 11/10/2023
@MortenHolmgaard你确定它与所讨论的问题有关吗?你有依赖依赖。bindVersionProviderVersionProviderbindVersionProvider
0赞 Morten Holmgaard 11/10/2023
它现在可以与确切的更改一起使用 - tt 似乎只是一个干净的它丢失了,谢谢。