android - Dagger 2 对于 Android "cannot be provided without an @Provides-annotated method"

标签 android dagger-2 android-mvp dagger

我正在尝试为 Android 使用最新版本的 Dagger 2 V2.11 这是我的代码:
应用组件:

@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        ActivityBuildersModule.class,
        FragmentBuildersModule.class
})
public interface AppComponent {
    void inject(MyApplication myApplication);

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }

    @ExceptionRequestsQualifier
    ExceptionRequestsServices exceptionRequestsServices();

}

AppModule:

@Module(includes = {ActivityModule.class, FragmentModule.class})
public class AppModule {

    @Provides
    CompositeDisposable provideCompositeDisposable() {
        return new CompositeDisposable();
    }

    @Provides
    @ExceptionRequestsQualifier
    ExceptionRequestsServices provideExceptionRequests() {
        return new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(APIConstants.EXCEPTION_REQUESTS_BASE_URL)
                .build()
                .create(ExceptionRequestsServices.class);
    }

    @Singleton
    @Provides
    NetworkManager provideNetworkManager(Application app) {
        return new NetworkManager(app);
    }

}

ActivityBuildersModule:

@Module
public abstract class ActivityBuildersModule {

    @ActivityScope
    @ContributesAndroidInjector
    abstract ExceptionRequestsActivity contributeExceptionRequestsActivity();

}

Activity 模块:

@Module()
public abstract class ActivityModule {

    @Provides
    @ActivityScope
    static ExceptionRequestsMvpPresenter<ExceptionRequestsMvpView> bindExceptionRequestsPresenter(
            ExceptionRequestsPresenter<ExceptionRequestsMvpView> presenter) {
        return presenter;
    }

}

FragmentBuildersModule:

@Module
public abstract class FragmentBuildersModule {

    @FragmentScope
    @ContributesAndroidInjector
    abstract AddApplicantFragment contributeAddApplicantFragment();

    @FragmentScope
    @ContributesAndroidInjector
    abstract PledgeFragment contributePledgeFragment();

}

fragment 模块:

@Module()
public abstract class FragmentModule {

    @Provides
    @FragmentScope
    static AddApplicantMvpPresenter<AddApplicantMvpView> bindAddApplicantPresenter(
            AddApplicantPresenter<AddApplicantMvpView> presenter) {
        return presenter;
    }

    @Provides
    @FragmentScope
    static PledgeMvpPresenter<PledgeMvpView> bindPledgePresenter(
            PledgePresenter<PledgeMvpView> presenter) {
        return presenter;
    }

}

AddApplicantPresenter:

public class AddApplicantPresenter<V extends AddApplicantMvpView> extends BasePresenter<V> implements AddApplicantMvpPresenter<V> {

    @Inject
    @ExceptionRequestsQualifier
    ExceptionRequestsServices mExceptionRequestsServices;

    @Inject
    NetworkManager mNetworkManager;

    @Inject
    public AddApplicantPresenter(CompositeDisposable compositeDisposable) {
        super(compositeDisposable);
    }

}

AddApplicantMvpPresenter:

@FragmentScope
public interface AddApplicantMvpPresenter<V extends AddApplicantMvpView> extends MvpPresenter<V> {

    void addApplicant(String name, String qatarId,
                      String date, String mobile,
                      ChosenImage chosenImage);

}

ActivityScope:

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

fragment 作用域:

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface FragmentScope {
}

错误日志:

Error:(21, 1) error: mypackagename.di.component.AppComponent scoped with @Singleton may not reference bindings with different scopes:
@Provides @mypackagename.di.scope.ActivityScope mypackagename.ui.exceptionrequests.ExceptionRequestsMvpPresenter<mypackagename.ui.exceptionrequests.ExceptionRequestsMvpView> mypackagename.di.module.ActivityModule.bindExceptionRequestsPresenter(mypackagename.ui.exceptionrequests.ExceptionRequestsPresenter<mypackagename.ui.exceptionrequests.ExceptionRequestsMvpView>)
@Provides @mypackagename.di.scope.FragmentScope mypackagename.ui.addapplicant.AddApplicantMvpPresenter<mypackagename.ui.addapplicant.AddApplicantMvpView> mypackagename.di.module.FragmentModule.bindAddApplicantPresenter(mypackagename.ui.addapplicant.AddApplicantPresenter<mypackagename.ui.addapplicant.AddApplicantMvpView>)
@Provides @mypackagename.di.scope.FragmentScope mypackagename.ui.pledge.PledgeMvpPresenter<mypackagename.ui.pledge.PledgeMvpView> mypackagename.di.module.FragmentModule.bindPledgePresenter(mypackagename.ui.pledge.PledgePresenter<mypackagename.ui.pledge.PledgeMvpView>)

最佳答案

Modules & Components 不能有不同的Scopes 您可以让 Components 拥有多个 Scopes,这可以解决它。 尝试将其移动到不同的组件并将其添加为组件依赖

我希望将来他们能解决这个问题,就像我在我的项目中所做的那样。 目前,Dagger2 允许具有 NoScope 和单一作用域的模块。这应该与您的组件匹配。

拇指法则:不同的范围有不同的组成部分。 对于您的应用程序,您需要三个组件, FragmentComponent (FragmentScope) :-(理想情况下这应该是 ActivityComponent) ApplicationComponent (单例)

https://medium.com/@patrykpoborca/making-a-best-practice-app-4-dagger-2-267ec5f6c89a 阅读有关范围的更多信息。

关于android - Dagger 2 对于 Android "cannot be provided without an @Provides-annotated method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086951/

相关文章:

java - 如何在 List<TextView> android 中查找字符串

java - mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;

android - 将 Dagger2 与 PreferenceFragmentCompat 结合使用

android - 如何将监听器从 Fragment 传递到 DialogFragment?

android - Android 服务在 MVP 模式中应该扮演什么角色?

android - 恢复 ViewPager fragment 的演示者 (MVP)

android - 无法从 youtube 下载视频

android - 在 Android 项目中读取 Jenkins 环境变量?为自动构建签署 APK

java - 有什么方法可以让 IntelliJ IDEA 在 Java 项目中识别 Dagger 2 生成的类?

java - Dagger 2 依赖注入(inject)不起作用