多个模块引用一个核心模块时出现Android手柄注入周期错误

pb3skfrl  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(150)

我们目前有3个模块:应用程序,API和核心。
应用程序依赖于API和核心。
API依赖于Core。
在我们的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:error:[Dagger/DependencyCycle] Found a dependency cycle:public abstract static class SingletonC implements App_GeneratedInjector,^ com.xxx.core.VersionProvider is injected at com.xxx.core.hilt.CoreModule.bindVersionProvider(provider)com.xxx.core.VersionProvider在com.xxx.core.hilt.CoreModule.bindVersionProvider处注入(供应商).通过以下方式请求周期:在com. xxx. API.core.hilt.ApiClientModule.bindNetworkManager处注入com.xxx.core.VersionProvider(�,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(service)注入com.xxx.API.services.inventory.IInventoryService在com.xxx.managers.inventory.InventoryManager处注入(inventoryService,�)com.xxx.managers.inventory.InventoryManager在com.xxx.core.hilt.ManagerModule.bindInventoryManager(manager)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模块引用。
但我不知道我缺少什么希尔特配置,使它的工作。
有线索吗?

n9vozmp4

n9vozmp41#

我认为依赖循环发生在CoreModule中。请尝试删除以下内容:

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

字符串
并使用@Singleton注解VersionProvider类。

相关问题