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

CJR*_*CJR 5 android dagger dagger-2

我有课StartRouter。我想为每个活动提供此类的不同实例,并只要活动处于活动状态就保持活动状态(为此我所做的@ActivityScope)。

\n\n

问题是它在我的代码中没有这样做。看起来 dagger 为每个注释提供了一个实例,在我的例子中,一次为@ActivityScope. 该瞄准镜是定制的匕首瞄准镜。

\n\n

这是我的两个模块(每个活动一个),第一个模块:

\n\n
@Module\npublic class SplashModule {\n\n    @Provides\n    SplashVMFactory splashVMFactory(StartRouter startRouter){\n        return new SplashVMFactory(startRouter);\n\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个模块:

\n\n
@Module\npublic class QuestionModule {\n\n    @Provides\n    QuestionVMFactory questionVMFactory(StartRouter startRouter){\n        return new QuestionVMFactory(startRouter);\n    }\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有这个:

\n\n
@Module\npublic abstract class BinderModule {\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = SplashModule.class)\n    abstract SplashActivity bindSplashActivity();\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = QuestionModule.class)\n    abstract QuestionActivity bindQuestionActivity();\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的应用程序组件:

\n\n
@ApplicationScope\n@Component(modules = {AndroidInjectionModule.class,\n        BinderModule.class,\n        SplashModule.class,\n        QuestionModule.class})\npublic interface AppComponent {\n\n    @Component.Builder\n    interface Builder {\n        @BindsInstance\n        Builder application(App app);\n        AppComponent build();\n    }\n\n    void inject(App app);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我运行这个时,我收到此错误:

\n\n
error: [Dagger/DuplicateBindings] com.example.StartRouter is bound multiple times:\n@Provides com.example.StartRouter com.example.QuestionModule.startRouter()\n@Provides com.example.StartRouter com.example.SplashModule.startRouter()\ncom.example.StartRouter is injected at\ncom.example.LoginModule.loginVMFactory(\xe2\x80\xa6, startRouter)\ncom.example.LoginVMFactory is injected at\ncom.example.LoginActivity.factory\ncom.example.LoginActivity is injected at\ndagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindLoginActivity.LoginActivitySubcomponent]\nIt is also requested at:\ncom.example.QuestionModule.questionVMFactory(\xe2\x80\xa6, startRouter)\nThe following other entry points also depend on it:\ndagger.android.AndroidInjector.inject(T) [com.example.AppComponent ? com.example.BinderModule_BindQuestionActivity.QuestionActivitySubcomponent]\n
Run Code Online (Sandbox Code Playgroud)\n\n

(除了这两个示例之外,其他模块中也提供了 StartRouter,正如您从我的错误中看到的那样)。

\n\n

我想,如果我理解正确的话,使用@ActivityScopein BinderModulewith@ContributesAndroidInjector将为每个活动创建与活动本身一样长的不同组件,但我似乎理解错了?

\n\n

如果我通过使用和提供 1 个模块来区分StartRouter我的 s 中的不同之处,那么这将通过提供不同的实例来解决问题吗?但这并不能帮助我解决我的问题。简而言之,我的问题是,我无法提供与活动本身一样长的实例(每个活动 1 个)。关于我如何做到这一点有什么建议吗?@module@named@namedStartRouter@ActivityScoped StartRouter

\n

Dav*_*jak 5

您的设置很好,但事实上您添加了两个模块(都绑定StartRouterAppComponent,因此您多次绑定它会出现错误。

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

由于您希望每个 Activity 都有一个实例,因此无需将模块添加到AppComponent. 您应该能够从中删除这两个模块。