CJR*_*CJR 5 android dagger dagger-2
我有课StartRouter。我想为每个活动提供此类的不同实例,并只要活动处于活动状态就保持活动状态(为此我所做的@ActivityScope)。
问题是它在我的代码中没有这样做。看起来 dagger 为每个注释提供了一个实例,在我的例子中,一次为@ActivityScope. 该瞄准镜是定制的匕首瞄准镜。
这是我的两个模块(每个活动一个),第一个模块:
\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}\nRun 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}\nRun 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}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n当我运行这个时,我收到此错误:
\n\nerror: [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]\nRun Code Online (Sandbox Code Playgroud)\n\n(除了这两个示例之外,其他模块中也提供了 StartRouter,正如您从我的错误中看到的那样)。
\n\n我想,如果我理解正确的话,使用@ActivityScopein BinderModulewith@ContributesAndroidInjector将为每个活动创建与活动本身一样长的不同组件,但我似乎理解错了?
如果我通过使用和提供 1 个模块来区分StartRouter我的 s 中的不同之处,那么这将通过提供不同的实例来解决问题吗?但这并不能帮助我解决我的问题。简而言之,我的问题是,我无法提供与活动本身一样长的实例(每个活动 1 个)。关于我如何做到这一点有什么建议吗?@module@named@namedStartRouter@ActivityScoped StartRouter
您的设置很好,但事实上您还添加了两个模块(都绑定StartRouter)AppComponent,因此您多次绑定它会出现错误。
@Component(modules = {AndroidInjectionModule.class,
BinderModule.class,
SplashModule.class, // <== 1.
QuestionModule.class}) // <== 2.
public interface AppComponent { .. }
Run Code Online (Sandbox Code Playgroud)
由于您希望每个 Activity 都有一个实例,因此无需将模块添加到AppComponent. 您应该能够从中删除这两个模块。
| 归档时间: |
|
| 查看次数: |
8689 次 |
| 最近记录: |