ошибка: [Dagger / DuplicateBindings] com.example.StartRouter связан несколько раз? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть класс 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 на каждое действие), которые живут так же долго, как и само действие. Любые предложения о том, как я мог это сделать?

1 Ответ

1 голос
/ 25 июня 2019

Ваша настройка в порядке, но для факта, что вы также добавляете оба модуля (оба связывающих StartRouter) к AppComponent, таким образом, ошибка, которую вы связываете несколько раз.

@Component(modules = {AndroidInjectionModule.class,
        BinderModule.class,
        SplashModule.class,    // <== 1.
        QuestionModule.class}) // <== 2.
public interface AppComponent { .. }

Так как вы хотите один экземпляр для каждого действия, нет необходимости добавлять модули в AppComponent.Вы должны быть в состоянии удалить эти 2 модуля из него.

...