android - Dagger 2:如果没有 @Inject 构造函数或 @Provides,则无法提供 ImagesRepo
问题描述
我提供ImagesRepo
using RepoModule
,ImgesReo 依赖,RxApiController
并且SharePreferenceHelper
我自己提供这些依赖 项RepoModule
,这些依赖项来自AppModule
.
@Module(includes = AppModule.class)
public class RepoModule {
@Provides
@Inject
public ImagesRepo providesImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) {
return new ImagesRepo(rxApiController, sharePreferenceHelper);
}
}
当我尝试ImagesRepo
像这样注入时
@Inject
public ImagesRepo imagesRepo;
public MyActivityViewmodelImpl() {
MyApplication.getRepoComponent().inject(this);
}
如果我@Inject
从构造函数中删除它会显示错误ImagesRepo
,我认为我正在提供RxApiController
和 SharePreferenceHelper
来自RepoModule
@Inject
public ImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) {
super(rxApiController, sharePreferenceHelper);
}
问题是为什么我想@Inject
在ImagesRepo
构造函数中添加,如果我为其本身提供依赖ImagesRepo
项RepoModule
解决方案
为避免错误和混淆,您应该确保了解每个注释的作用。@Provides
方法不需要注释@Inject
。_ 在这里,您甚至可以单独使用构造函数注入,并且根本不需要@Provides
方法(或模块),从而减少了所需的样板数量。
至于您的具体错误,我猜您要么没有添加RepoModule
到您的组件中,要么您尝试使用错误的组件(无权访问RepoModule
)注入您的类。
添加@Inject
构造函数ImagesRepo
会将其标记为构造函数注入,以便 Dagger 可以并且将为您创建它。不需要模块(您没有添加/组件无法访问),这就是为什么当您这样做时它会“工作”的原因。
为了避免混淆和错误,要么使用@Provides
模块中的方法,要么使用构造函数注入——最好是构造函数注入,这将消除样板文件,这也是你首先使用 Dagger 的原因之一。
推荐阅读
- sql - 查询具有多个可能值但仅返回 1 个值的表
- sql - 如何为以下业务逻辑编写 sql 查询?
- python - 如何在 Django 中为 HttpRequest.POST 设置默认值?
- reactjs - 如何从其他文件/模块调用 onsnapshot firebase 结果?
- amazon-web-services - 有没有办法我可以每秒准确地排队 1 条消息 sqs 来触发 lambda
- microsoft-teams - 如何在 MS 团队自适应卡中设置动作样式
- javascript - 如何在 p5.js 中为视频游戏制作分屏?
- javascript - 我们如何限制一次可以滚动多少用户?
- reactjs - 如何在反应中将某些特定字母更改为绿色方形
- c++ - C++ 20 指定初始化的遗漏字段是否保证初始化为零?