Android 匕首2.11依赖循环

Android 匕首2.11依赖循环,android,dagger-2,Android,Dagger 2,使用Dagger2.11,以下代码返回“错误:[Dagger.android.androidjector.inject(T)]发现依赖循环:”。发生这种情况是因为provideApp方法具有参数“App App”。如果我删除它并直接提供应用程序实例,代码就会编译并运行 从我以前看到的示例来看,通常的做法是在模块中保留应用程序的实例,并将其用于其他提供者,但由于此模块类现在是抽象的,这不起作用,因为@Provider方法需要是静态的 我怎样才能解决这个问题 @Module(includes = A

使用Dagger2.11,以下代码返回“错误:[Dagger.android.androidjector.inject(T)]发现依赖循环:”。发生这种情况是因为provideApp方法具有参数“App App”。如果我删除它并直接提供应用程序实例,代码就会编译并运行

从我以前看到的示例来看,通常的做法是在模块中保留应用程序的实例,并将其用于其他提供者,但由于此模块类现在是抽象的,这不起作用,因为@Provider方法需要是静态的

我怎样才能解决这个问题

@Module(includes = AndroidInjectionModule.class)
public abstract class AppModule {

     @Provides
     @Singleton
     static App provideApp(App app) {
        return app;
     }

     @Provides
     static Authenticator provideAuthenticator(App app) {
         return new AuthenticatorImpl(app);
     }
}
编辑:

我需要实现的基本上是这种行为:

@Module(includes = AndroidInjectionModule.class)
public class AppModule {

    private App application;

    AppModule(App app) {
        application = app;
    }

    @Provides
    Authenticator provideAuthenticator() {
        return new AuthenticatorImpl(application);
    }
}
但是,这不起作用,因为AppModule现在是一个抽象类,如果我使用@Providers Authenticator provideAuthenticator()而不使用static关键字,应用程序将无法编译。如果使用static关键字,则无法访问非静态应用程序字段。

您的代码:

 @Provides
 @Singleton
 static App provideApp(App app) {
    return app;
 }
表示“将应用程序作为依赖项提供应用程序”。换句话说,您希望提供
App
,但首先需要
App
。这就是你的周期

这个问题的最佳解决方案是遵循Demeter规则,而不是提供
应用程序
单例

为什么
AuthenticatorImpl
需要知道
应用程序的具体类型
子类?我打赌您可以重构该类,使
应用程序
不再是它的直接依赖项-也许您只需要一个上下文。如果您只需要应用程序范围内的单例,只需使用
@Singleton
@提供的方法制作一个模块,并将其安装到应用程序组件中即可

如果在所有这些之后,您发现必须提供子类,那么您可以创建一个不包含任何其他模块的新模块:

@Module //don't include other modules here
class AppModule {

    private final App app;

    public AppModule(App app) {
        this.app = app;
    }

    @Provides
    @Singleton
    App app() {
        return app;
    }
} 
并将其安装到应用程序级组件中:

    //inside your App class

    DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build()
            .inject(this);
您的代码:

 @Provides
 @Singleton
 static App provideApp(App app) {
    return app;
 }
表示“将应用程序作为依赖项提供应用程序”。换句话说,您希望提供
App
,但首先需要
App
。这就是你的周期

这个问题的最佳解决方案是遵循Demeter规则,而不是提供
应用程序
单例

为什么
AuthenticatorImpl
需要知道
应用程序的具体类型
子类?我打赌您可以重构该类,使
应用程序
不再是它的直接依赖项-也许您只需要一个上下文。如果您只需要应用程序范围内的单例,只需使用
@Singleton
@提供的方法制作一个模块,并将其安装到应用程序组件中即可

如果在所有这些之后,您发现必须提供子类,那么您可以创建一个不包含任何其他模块的新模块:

@Module //don't include other modules here
class AppModule {

    private final App app;

    public AppModule(App app) {
        this.app = app;
    }

    @Provides
    @Singleton
    App app() {
        return app;
    }
} 
并将其安装到应用程序级组件中:

    //inside your App class

    DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build()
            .inject(this);

如果在
应用程序中实现了以下功能,则不需要AppModule:

公共类应用程序扩展DaggerApplication{
专用雄激素注射器;
@dagger.组件(模块={
AndroidSupportInjectionModule.class,
AppModule.class
})
公共接口组件扩展了AndroidJector{
@dagger.Component.Builder
抽象类生成器扩展了Androidjector.Builder{}
}
@凌驾

受保护的AndroidJector如果在
应用程序中实现以下功能,则不需要AppModule:

公共类应用程序扩展DaggerApplication{
专用雄激素注射器;
@dagger.组件(模块={
AndroidSupportInjectionModule.class,
AppModule.class
})
公共接口组件扩展了AndroidJector{
@dagger.Component.Builder
抽象类生成器扩展了Androidjector.Builder{}
}
@凌驾

受保护的AndroidJetor
App provideApp(App-App)
->…所以你需要一个
App
来提供一个
App
?这可能是一个打字错误,或者你没有通过我最初的帖子@DavidMedenjak
App provideApp(App-App)来考虑这一点
->…所以你需要一个
应用程序来提供一个
应用程序
?这要么是一个打字错误,要么你没有通过我最初的帖子@DavidMedenjak来考虑这一点