【发布时间】:2019-01-24 01:12:06
【问题描述】:
我想使用 Dagger 为带有子片段 (X...Z)FragModule 的 AFragment 组成一个模块。
从 ActivityBindingModule 开始,我定义了一个示例 Activity 的依赖模块
/* ActivityBindingModule.java */
@Module
public abstract class ActivityBindingModule{
@NonNull
@ActivityScoped
@ContributesAndroidInjector(modules = {
AFragModule.class,
BFragModule.class
// ... fragment modules
})
abstract MainActivity mainActivity();
}
在 AFragModule 中,我定义了它的子片段依赖模块。
/* AFragModule.java */
@Module
public abstract class AFragModule{
@NonNull
@FragmentScoped
@ContributesAndroidInjector(modules = {
XFragModule.class,
YFragModule.class
// ... child fragment modules
})
abstract AFragment providesFragment();
}
在 (X...Z)FragModule 中,我定义了它的依赖对象的提供者方法。
/* XFragModule.java */
@Module
public abstract class XFragModule{
@FragmentScoped
@ContributesAndroidInjector
abstract XFragment providesFragment();
@ActivityScoped
@Binds
abstract XContract.Presenter providesPresenter(XPresenter presenter);
}
我希望 (X...Z)FragModule 模块的范围在 AFragModule 中。并且 (X...Z)FragModules 的 Presenter 在同一个范围内存活,以便在 Presenter 之间进行通信。
XPresenter 实现本身使用构造函数注入器,带有@Singleton 参数(例如数据源)
我在上述范围内收到以下错误:
Cause: binding is not resolved for XContract.Presenter: ProvisionBinding{contributionType=UNIQUE, key=XContract.Presenter, bindingElement=Optional[providesPresenter(XPresenter)], contributingModule=Optional[XFragModule], kind=DELEGATE, nullableType=Optional.empty, wrappedMapKeyAnnotation=Optional.empty, provisionDependencies=[DependencyRequest{kind=INSTANCE, key=XPresenter, requestElement=Optional[presenter], isNullable=false}], injectionSites=[], unresolved=Optional.empty, scope=Optional[@ActivityScoped]}
编辑: 我也想检查一下我对范围的理解: 我“认为”我理解以下内容
@Singleton > @ActivityScope > @FragmentScope
范围不能依赖于相同或更小的范围 前任。 @ActivityScope 不能依赖于@ActivityScope 或@FragmentScope
范围可以依赖于任何更大的范围。 前任。 @FragmentScope 可以依赖于@Singleton、@ActivityScope 标记的方法。
【问题讨论】: