我使用ImagesRepo
提供了RepoModule
,ImgesReo依赖于RxApiController
和SharePreferenceHelper
,并且我在RepoModule
本身中提供了这些依赖关系,这些依赖关系来自{ {1}}。
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
答案 0 :(得分:0)
为避免错误和混乱,您应该确保了解每个注释的作用。 @Provides
方法不需要不需要@Inject
注释。在这里,您甚至可以单独使用构造函数注入,并且根本不需要@Provides
方法(或模块),从而减少了所需的样板数量。
关于您的特定错误,我想您可能没有在组件中添加RepoModule
,或者您尝试使用错误的组件(无法访问{{1 }}。
在RepoModule
的构造函数上添加@Inject
会将其标记为构造函数注入,以便Dagger可以并为您创建 。不需要该模块(您没有添加/组件无法访问),这就是为什么当您这样做时它将“起作用”的原因。
为避免混乱和错误,请使用模块中的ImagesRepo
方法或使用构造函数注入-最好使用构造函数注入来消除样板,这就是您这么做的原因之一d首先使用Dagger。