У меня есть класс 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
и наличием 1 модуля без @named
, то это решит проблему, предоставив разные StartRouter
экземпляры? Но это не помогает мне с моей проблемой. Короче говоря, у меня проблема с предоставлением @ActivityScoped
StartRouter
экземпляров (по 1 на каждое действие), которые живут так же долго, как и само действие. Любые предложения о том, как я мог это сделать?