错误:[Dagger / DuplicateBindings] com.example.StartRouter已绑定多次?

时间:2019-06-25 20:13:12

标签: android dagger-2 dagger

我有一个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个),它们与活动本身一样活泼。关于我该怎么做的任何建议?

1 个答案:

答案 0 :(得分:1)

您的设置很好,但是您还将两个模块(都绑定了StartRouter)都添加到了AppComponent中,因此您多次绑定了该错误。

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

由于您希望每个活动一个实例,因此无需将模块添加到AppComponent。您应该可以从其中删除这两个模块。