我有一个StartRouter
类。我想为每个活动提供不同的实例,只要活动活着(因为我制作了@ActivityScope
(。
问题是它在我的代码中没有这样做。在我的情况下,dagger每次注释提供了一个实例,一次是用于@ActivityScope
。此范围是自定义dagger范围。
这是我的两个模块(每个活动一个(,第一个模块:
@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(。
我以为,如果我理解正确的话,从BinderModule
中的@ActivityScope
使用@ContributesAndroidInjector
中,只要活动本身就可以为每个活动创建不同的组件,但我似乎已经理解了错误吗?
我通过使用@named
和有1个模块提供@named
提供1个模块,从而区分了@module
s中的不同StartRouter
,那么这将通过提供不同的StartRouter
实例来解决问题吗?但这对我的问题无济于事。简而言之,我的问题很难提供@ActivityScoped
StartRouter
实例(每项活动1个(,这些实例与活动本身一样长。关于我该怎么做的任何建议?
您的设置很好,但由于您也 添加两个模块(都绑定了StartRouter
(到AppComponent
,因此您多次绑定它的错误。
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }
由于您需要每个活动一个实例,因此无需将模块添加到AppComponent
。您应该能够从中删除这两个模块。