Dagger组件的范围存在冲突

时间:2018-01-27 07:39:23

标签: java android dependency-injection dagger-2

我正在使用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);
}
}

如何解决此问题?提前谢谢。

1 个答案:

答案 0 :(得分:6)

  

我有一个带有@Singleton范围的app组件,还有一个带有@Singleton范围的子组件。

不,不。子组件的范围不能与其父组件相同。您可以阅读in the documentation

  

任何子组件都不能与任何祖先组件关联同一范围,尽管两个不可相互访问的子组件可以与同一范围关联,因为没有关于存放范围对象的位置的歧义。

您的第一个错误是因为父组件和子组件共享相同的范围,您的第二个错误是因为子组件需要范围。两个错误的解决方案是为子组件提供与父组件不同的范围,或者根本不使用子组件(如果它们都应该是@Singleton,为什么需要2?)

通常我们倾向于为我们的子组件创建@PerActivity@ActivityScoped等范围,这些子组件 - 如名称所示 - 表示活动的生命周期并在其中使用。