我将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);
}
答案 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();
}
}