我正在使用Dagger,我有一个带有@Singleton
范围的app组件,还有一个带有@Singleton
范围的子组件。现在,当我编译它时,我得到了这个错误:
[io.droid.nowtellapp.dagger.SignInMvpComponet] io.droid.nowtellapp.dagger.SignInMvpComponet具有冲突的范围: io.droid.nowtellapp.dagger.ApplicationComponent也有@Singleton
要解决此错误,我从子组件中删除了@Singleton
并对其进行了编译,这次出现此错误:
错误:(12,1)错误:io.droid.nowtellapp.dagger.SignInMvpComponet (unscoped)可能不会引用作用域绑定:@Singleton @Provides io.droid.nowtellapp.mvp.SignInMvp.Presenter io.droid.nowtellapp.dagger.SignInMvpModule.presenter(io.droid.nowtellapp.webservices.NowTellApi)
也出现此错误:
错误:(21,8)错误:[ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor无法处理此类,因为并非所有依赖项都可以解析。使用生成的代码检查编译错误或循环依赖。
这是我的ApplicationComponent
@Singleton
@Component(modules = {AppModule.class, RetroApiModule.class})
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
SignInMvpComponet signInMvpComponet(SignInMvpModule signInMvpModule);
}
这是我的SignInMvpComponet
@Subcomponent(modules = {SignInMvpModule.class})
public interface SignInMvpComponet {
void inject(SignInFragment signInFragment);
这是SignInMvpModule类
@Module
public class SignInMvpModule {
private final SignInMvp.View view;
public SignInMvpModule(SignInMvp.View view) {
this.view = view;
}
@Singleton
@Provides
SignInMvp.Presenter presenter(NowTellApi api) {
return new SignInPresenter(view,api);
}
}
如何解决此问题?提前谢谢。
答案 0 :(得分:6)
我有一个带有@Singleton范围的app组件,还有一个带有@Singleton范围的子组件。
不,不。子组件的范围不能与其父组件相同。您可以阅读in the documentation:
任何子组件都不能与任何祖先组件关联同一范围,尽管两个不可相互访问的子组件可以与同一范围关联,因为没有关于存放范围对象的位置的歧义。
您的第一个错误是因为父组件和子组件共享相同的范围,您的第二个错误是因为子组件需要范围。两个错误的解决方案是为子组件提供与父组件不同的范围,或者根本不使用子组件(如果它们都应该是@Singleton
,为什么需要2?)
通常我们倾向于为我们的子组件创建@PerActivity
或@ActivityScoped
等范围,这些子组件 - 如名称所示 - 表示活动的生命周期并在其中使用。