匕首2:如果没有@Inject构造函数或@Provides,则无法提供ImagesRepo

时间:2018-09-28 06:19:33

标签: android dagger-2 dagger

我使用ImagesRepo提供了RepoModule,ImgesReo依赖于RxApiControllerSharePreferenceHelper,并且我在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提供RxApiControllerSharePreferenceHelper

RepoModule

如果我要在@Inject public ImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) { super(rxApiController, sharePreferenceHelper); } 本身中为@Inject提供依赖关系,为什么要在ImagesRepo构造函数中添加ImagesRepo

1 个答案:

答案 0 :(得分:0)

为避免错误和混乱,您应该确保了解每个注释的作用。 @Provides方法不需要不需要@Inject注释。在这里,您甚至可以单独使用构造函数注入,并且根本不需要@Provides方法(或模块),从而减少了所需的样板数量。

关于您的特定错误,我想您可能没有在组件中添加RepoModule,或者您尝试使用错误的组件(无法访问{{1 }}。


RepoModule的构造函数上添加@Inject会将其标记为构造函数注入,以便Dagger可以并为您创建 。不需要该模块(您没有添加/组件无法访问),这就是为什么当您这样做时它将“起作用”的原因。

为避免混乱和错误,请使用模块中的ImagesRepo方法或使用构造函数注入-最好使用构造函数注入来消除样板,这就是您这么做的原因之一d首先使用Dagger。