Android 匕首2.11依赖循环
使用Dagger2.11,以下代码返回“错误:[Dagger.android.androidjector.inject(T)]发现依赖循环:”。发生这种情况是因为provideApp方法具有参数“App App”。如果我删除它并直接提供应用程序实例,代码就会编译并运行 从我以前看到的示例来看,通常的做法是在模块中保留应用程序的实例,并将其用于其他提供者,但由于此模块类现在是抽象的,这不起作用,因为@Provider方法需要是静态的 我怎样才能解决这个问题Android 匕首2.11依赖循环,android,dagger-2,Android,Dagger 2,使用Dagger2.11,以下代码返回“错误:[Dagger.android.androidjector.inject(T)]发现依赖循环:”。发生这种情况是因为provideApp方法具有参数“App App”。如果我删除它并直接提供应用程序实例,代码就会编译并运行 从我以前看到的示例来看,通常的做法是在模块中保留应用程序的实例,并将其用于其他提供者,但由于此模块类现在是抽象的,这不起作用,因为@Provider方法需要是静态的 我怎样才能解决这个问题 @Module(includes = A
@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{}
}
@凌驾
受保护的AndroidJetorApp provideApp(App-App)
->…所以你需要一个App
来提供一个App
?这可能是一个打字错误,或者你没有通过我最初的帖子@DavidMedenjakApp provideApp(App-App)来考虑这一点
->…所以你需要一个应用程序来提供一个应用程序
?这要么是一个打字错误,要么你没有通过我最初的帖子@DavidMedenjak来考虑这一点