提问人:Morten Holmgaard 提问时间:11/10/2023 更新时间:11/10/2023 访问量:51
多个模块引用核心模块的 Android 刀柄注入周期错误
Android hilt injection cycle error with multiple modules referencing a core module
问:
我们目前有 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 配置来使其工作。
有什么线索吗?
答:
我认为依赖循环发生在 .尝试删除此内容:CoreModule
@Singleton
@Binds
abstract fun bindVersionProvider(
provider: VersionProvider
): VersionProvider
并用 .VersionProvider
@Singleton
评论
bindVersionProvider
VersionProvider
bindVersionProvider
评论