我有一个StartRouter
班。我想为每个活动提供此类的不同实例,并在活动仍然存在的情况下保持活动状态(为此我制作了@ActivityScope
)。
问题是它在我的代码中没有做到这一点。似乎匕首为每个注解提供了一个实例,就我而言,@ActivityScope
一次。此范围是自定义匕首范围。
这是我的两个模块(每个活动一个),第一个模块:
@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
一起使用会为每个活动的活动创建不同的组件,只要活动本身,但我似乎理解错了?
如果通过使用StartRouter
来区分@module
中@named
中的不同@named
,并提供1个没有StartRouter
的模块,则可以通过提供不同的地址来解决问题@ActivityScoped
个实例?但这对我的问题没有帮助。简而言之,我的问题是,我无法提供StartRouter
{{1}}个实例(每个活动1个),它们与活动本身一样活泼。关于我该怎么做的任何建议?
答案 0 :(得分:1)
您的设置很好,但是您还还将两个模块(都绑定了StartRouter
)都添加到了AppComponent
中,因此您多次绑定了该错误。
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }
由于您希望每个活动一个实例,因此无需将模块添加到AppComponent
。您应该可以从其中删除这两个模块。