作者:koujj | 来源:互联网 | 2022-12-30 18:26
我正在使用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> David Medenj..:
我有一个带有@Singleton范围的app组件,还有一个带有@Singleton范围的子组件.
不,你没有.子组件的范围不能与其父组件相同.您可以阅读文档:
虽然两个不可相互可达的子组件可以与相同的范围相关联,但是没有任何子组件可以与任何祖先组件关联相同的范围,因为没有关于存储范围对象的位置的歧义.
您的第一个错误是因为父组件和子组件共享相同的范围,您的第二个错误是因为子组件需要范围.两个错误的解决方案是为子组件提供与父组件不同的范围,或者根本不使用子组件(如果它们都应该是@Singleton
,为什么需要2?)
通常我们倾向于为子组件创建范围@PerActivity
,或者@ActivityScoped
为子组件创建共享 - 如名称所示 - 共享活动的生命周期并在其中使用.