Dagger 2-如果没有@Provides注释的方法,则无法提供

时间:2019-08-21 03:05:21

标签: java android dagger-2

我将Dagger 2用于DI并收到消息错误:

  

MainFragmentContract.Presenter在没有   @提供注释的方法。

但是当我将 @Bind 的provideMainFragmentPresenter方法从MainFragmentModule移到ActivityBindingModule时,它会成功构建。

为什么当我移到ActivityBindingModule类时它为什么起作用?同样,如果我将该方法移到ActivityBindingModule类中,我也不能添加范围,因为我得到了消息:

  

AppComponent的范围为scope.ApplicationScope可能未引用   具有不同范围的绑定。

有我的代码。

AppComponent.java

@ApplicationScope
@Component(modules = {
        AndroidInjectionModule.class, // Important
        ApplicationModule.class,
        NetworkModule.class,
        ActivityBindingModule.class,
})
public interface AppComponent extends AndroidInjector<MyApplication> {

    void injectApplication(MyApplication myApplication);

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

        AppComponent build();

    }
}

ActivityBindingModel.java

@Module
public abstract class ActivityBindingModule {

    @ContributesAndroidInjector(modules = {MainModule.class})
    @ActivityScope
    abstract MainActivity mainActivity();

    @ContributesAndroidInjector(modules = {LoginModule.class})
    @ActivityScope
    abstract LoginActivity loginActivity();

    @ContributesAndroidInjector(modules = MainFragmentModule.class)
    @FragmentScope
    abstract MainFragment provideMainFragment();

}

MainModule.java(活动)

@Module
public abstract class MainModule {

    @Binds
    @ActivityScope
    public abstract MainContract.Presenter
    provideMainActivityPresenter(MainActivityPresenterImpl presenter);

}

MainFragmentModule.java

@Module
public abstract class MainFragmentModule {

    @Binds
    public abstract MainFragmentContract.Presenter
    provideMainFragmentPresenter(MainFragmentPresenterImpl presenter);


}

1 个答案:

答案 0 :(得分:4)

很显然,它是行不通的,因为如果您查看依赖图,您会发现它不知道如何创建 MainFragmentContract.Presenter 的>实例。

您必须通过指定知道如何创建MainFragmentContract.Presenter实例的模块,将其连接与您的应用程序级组件

因此,与其将provideMainFragmentPresenter方法从我的MainFragmentModule移到我的ActivityBindingModule,请执行以下操作:

@ApplicationScope
@Component(modules = {
    AndroidInjectionModule.class, 
    ApplicationModule.class,
    NetworkModule.class,
    ActivityBindingModule.class,
    MainFragmentModule.class     //This line right here
})
public interface AppComponent extends AndroidInjector<MyApplication> {

void injectApplication(MyApplication myApplication);

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

    AppComponent build();

 }
}