error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times?
error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times?
我有一个classStartRouter
。我想为每个 activity 提供此 class 的不同实例,并在 activity 存活时保持它存活(为此我制作了 @ActivityScope
)。
问题是它在我的代码中没有这样做。似乎匕首为每个注释提供一个实例,在我的例子中,@ActivityScope
一次。这个瞄准镜是一个自定义的匕首瞄准镜。
这是我的两个模块(每个模块一个 activity),第一个模块:
@Module
public class SplashModule {
@Provides
SplashVMFactory splashVMFactory(StartRouter startRouter){
return new SplashVMFactory(startRouter);
@Provides
StartRouter startRouter(){
return new StartRouter();
}
}
第二个模块:
@Module
public class QuestionModule {
@Provides
QuestionVMFactory questionVMFactory(StartRouter startRouter){
return new QuestionVMFactory(startRouter);
}
@Provides
StartRouter startRouter(){
return new StartRouter();
}
}
我有这个:
@Module
public abstract class BinderModule {
@ActivityScope
@ContributesAndroidInjector(modules = SplashModule.class)
abstract SplashActivity bindSplashActivity();
@ActivityScope
@ContributesAndroidInjector(modules = QuestionModule.class)
abstract QuestionActivity bindQuestionActivity();
}
我的应用程序组件:
@ApplicationScope
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class,
QuestionModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App app);
AppComponent build();
}
void inject(App app);
}
当我 运行 这个时,我得到这个错误:
error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times:
@Provides com.example.StartRouter com.example.QuestionModule.startRouter()
@Provides com.example.StartRouter com.example.SplashModule.startRouter()
com.example.StartRouter is injected at
com.example.LoginModule.loginVMFactory(…, startRouter)
com.example.LoginVMFactory is injected at
com.example.LoginActivity.factory
com.example.LoginActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindLoginActivity.LoginActivitySubcomponent]
It is also requested at:
com.example.QuestionModule.questionVMFactory(…, startRouter)
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindQuestionActivity.QuestionActivitySubcomponent]
(除了这两个示例之外,其他模块中也提供了 StartRouter,正如您从我的错误中看到的那样)。
我想,如果我没理解错的话,@ActivityScope
在 BinderModule
和 @ContributesAndroidInjector
中的用法将为每个 activity 活着的人创建不同的组件只要是activity本身,不过我好像理解错了?
如果我通过使用 @named
来区分 @module
中的不同 StartRouter
并且在没有 @named
的情况下提供 1 个模块,那么这将解决问题提供不同的 StartRouter
实例?但这对我的问题没有帮助。我的问题是,简而言之,我无法提供与 activity 本身一样长的 @ActivityScoped
StartRouter
个实例(每个 activity 实例 1 个)。关于如何做到这一点有什么建议吗?
您的设置很好,但由于您 还 添加了两个模块(都绑定 StartRouter
)到 AppComponent
,因此您的错误多次绑定。
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }
由于每个 Activity 需要一个实例,因此无需将模块添加到 AppComponent
。您应该能够从中删除这两个模块。
我有一个classStartRouter
。我想为每个 activity 提供此 class 的不同实例,并在 activity 存活时保持它存活(为此我制作了 @ActivityScope
)。
问题是它在我的代码中没有这样做。似乎匕首为每个注释提供一个实例,在我的例子中,@ActivityScope
一次。这个瞄准镜是一个自定义的匕首瞄准镜。
这是我的两个模块(每个模块一个 activity),第一个模块:
@Module
public class SplashModule {
@Provides
SplashVMFactory splashVMFactory(StartRouter startRouter){
return new SplashVMFactory(startRouter);
@Provides
StartRouter startRouter(){
return new StartRouter();
}
}
第二个模块:
@Module
public class QuestionModule {
@Provides
QuestionVMFactory questionVMFactory(StartRouter startRouter){
return new QuestionVMFactory(startRouter);
}
@Provides
StartRouter startRouter(){
return new StartRouter();
}
}
我有这个:
@Module
public abstract class BinderModule {
@ActivityScope
@ContributesAndroidInjector(modules = SplashModule.class)
abstract SplashActivity bindSplashActivity();
@ActivityScope
@ContributesAndroidInjector(modules = QuestionModule.class)
abstract QuestionActivity bindQuestionActivity();
}
我的应用程序组件:
@ApplicationScope
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class,
QuestionModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App app);
AppComponent build();
}
void inject(App app);
}
当我 运行 这个时,我得到这个错误:
error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times:
@Provides com.example.StartRouter com.example.QuestionModule.startRouter()
@Provides com.example.StartRouter com.example.SplashModule.startRouter()
com.example.StartRouter is injected at
com.example.LoginModule.loginVMFactory(…, startRouter)
com.example.LoginVMFactory is injected at
com.example.LoginActivity.factory
com.example.LoginActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindLoginActivity.LoginActivitySubcomponent]
It is also requested at:
com.example.QuestionModule.questionVMFactory(…, startRouter)
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindQuestionActivity.QuestionActivitySubcomponent]
(除了这两个示例之外,其他模块中也提供了 StartRouter,正如您从我的错误中看到的那样)。
我想,如果我没理解错的话,@ActivityScope
在 BinderModule
和 @ContributesAndroidInjector
中的用法将为每个 activity 活着的人创建不同的组件只要是activity本身,不过我好像理解错了?
如果我通过使用 @named
来区分 @module
中的不同 StartRouter
并且在没有 @named
的情况下提供 1 个模块,那么这将解决问题提供不同的 StartRouter
实例?但这对我的问题没有帮助。我的问题是,简而言之,我无法提供与 activity 本身一样长的 @ActivityScoped
StartRouter
个实例(每个 activity 实例 1 个)。关于如何做到这一点有什么建议吗?
您的设置很好,但由于您 还 添加了两个模块(都绑定 StartRouter
)到 AppComponent
,因此您的错误多次绑定。
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }
由于每个 Activity 需要一个实例,因此无需将模块添加到 AppComponent
。您应该能够从中删除这两个模块。