错误:[匕首/副词] com.example.startrouter多次绑定



我有一个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。您应该能够从中删除这两个模块。

最新更新