首页 > 解决方案 > Dagger 2:如果没有 @Inject 构造函数或 @Provides,则无法提供 ImagesRepo

问题描述

我提供ImagesRepousing 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,我认为我正在提供RxApiControllerSharePreferenceHelper来自RepoModule

@Inject
public ImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) {
    super(rxApiController, sharePreferenceHelper);
}

问题是为什么我想@InjectImagesRepo构造函数中添加,如果我为其本身提供依赖ImagesRepoRepoModule

标签: androiddagger-2dagger

解决方案


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

至于您的具体错误,我猜您要么没有添加RepoModule到您的组件中,要么您尝试使用错误的组件(无权访问RepoModule)注入您的类。


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

为了避免混淆和错误,要么使用@Provides模块中的方法,要么使用构造函数注入——最好是构造函数注入,这将消除样板文件,这也是你首先使用 Dagger 的原因之一。


推荐阅读