首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矛盾`@Inject`‘

矛盾`@Inject`‘
EN

Stack Overflow用户
提问于 2022-08-17 19:15:11
回答 1查看 32关注 0票数 0

最近的刀柄更新增加了一些警告,我有点不知道他们想告诉我什么,而警告中的链接也没有多大帮助。

com.demo.myapp.data.repositories.datastores.AppSettingsRepository是多次绑定的:@Inject com.demo.myapp.data.repositories.datastores.AppSettingsRepository(com.demo.myapp.data.datastores.CompanySettingsDataStore) com.demo.myapp.App_HiltComponents.SingletonC“提供@dagger.hilt.android.scopes.ViewModelScoped @org.jetbrains.annotations.NotNull com.demo.myapp.data.repositories.datastores.AppSettingsRepository com.demo.myapp.di.modules.RepositoryModule.provideAppSettingsRepository(com.demo.myapp.data”.datastores.CompanySettingsDataStore) com.demo.myapp.App_HiltComponents.SingletonC?com.demo.myapp.App_HiltComponents.ActivityRetainedC?com.demo.myapp.App_HiltComponents.ViewModelC这个条件以前从未被验证过,很快就会成为一个错误。见https://dagger.dev/conflicting-inject

我希望有人能更好地解释这个警告,因为我不知道它认为什么是重复的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 20:00:41

错误说明AppSettingsRepository绑定了两次:一次在SingletonComponent中,一次在ViewModelComponent中。

SingletonComponent绑定来自AppSettingsRepository上的一个@Inject注释。SingletonComponent中提供的东西(直接或间接地)依赖于AppSettingsRepository,所以Dagger会自动将该绑定放在SingletonComponent中。

ViewModelComponent绑定来自RepositoryModule中的显式@Provides方法,该方法安装在ViewModelComponent中。

正如链接页面中提到的,您有三个选项:

  • 删除ViewModelScoped绑定。AppSettingsRepository听起来应该是一个单例,所以如果同一个ViewModel中的所有绑定都使用相同的实例是很重要的,那么始终可以用@Singleton对类进行注释。

  • 将ViewModelScoped绑定移动到SingletonComponent。@Provides方法的唯一依赖项已经在SingletonComponent中可用,因此在本例中这当然是可能的。

  • 在ViewModelScoped绑定上添加了一个限定符。如果@Provides方法除了简单地调用构造函数之外还有其他逻辑,而且在SingletonComponent中不需要这种逻辑,这是适当的。在这种情况下,您将希望在ViewModelComponent中生成依赖于AppSettingsRepository的任何其他内容,并对此依赖项使用限定符。

注意,错误输出中的SingletonC是由Hilt生成的Dagger组件,对应于Hilt的SingletonComponent。这同样适用于ViewModelC,它是对应于ViewModelComponent的Dagger子组件。警告是由Dagger (而不是Hilt)在处理这些组件时生成的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73393844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档