You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dagger-Android中为所有Activity共享依赖并避免代码重复?

解决Dagger-Android中通用Activity依赖的重复代码问题

你遇到的这个问题在Dagger-Android开发里很常见——每个Activity的子组件是独立存在的,根组件无法直接获取Activity实例,所以没法在根模块里直接提供依赖于Activity的通用类。不过我们可以通过抽取通用模块+复用模块引用的方式彻底解决重复代码的问题,具体步骤如下:

1. 创建通用的BaseActivityModule

先把所有Activity都需要的通用依赖(比如你的Navigator)抽到一个公共模块里。这个模块里的Provider方法直接依赖Activity父类就行,Dagger会自动在每个Activity的子组件中注入对应的具体Activity实例:

@Module
class BaseActivityModule {
    @Provides
    @PerActivity
    fun provideNavigator(activity: Activity): Navigator {
        return NavigatorImpl(activity)
    }

    // 这里可以添加更多通用依赖,比如依赖Activity的ToastHelper、DialogManager等
    // @Provides
    // @PerActivity
    // fun provideToastHelper(activity: Activity): ToastHelper {
    //     return ToastHelperImpl(activity)
    // }
}

2. 在Activity的注入配置中引用通用模块

接下来,在你的AppInjectionModule里,给每个@ContributesAndroidInjector都引入这个BaseActivityModule,同时保留各自Activity的专属模块(如果有的话):

@Module(includes = [AndroidSupportInjectionModule::class])
interface AppInjectionModule {
    @PerActivity
    @ContributesAndroidInjector(modules = [BaseActivityModule::class, SomeActivityModule::class])
    fun someActivity(): SomeActivity

    @PerActivity
    @ContributesAndroidInjector(modules = [BaseActivityModule::class, AnotherActivityModule::class])
    fun anotherActivity(): AnotherActivity
}

为什么这个方法可行?

Dagger为每个Activity生成的子组件会自动包含BaseActivityModule,而每个子组件中已经绑定了对应的具体Activity实例(比如SomeActivity)。由于SomeActivity是Activity的子类,Dagger会自动将SomeActivity实例注入到BaseActivityModule的provideNavigator方法中,最终为每个Activity提供独立且正确的Navigator实例。

这样你就不用在每个SomeActivityModule、AnotherActivityModule中重复写Navigator的提供代码了,所有通用依赖都统一维护在BaseActivityModule里,后续新增Activity时,只要在@ContributesAndroidInjector中引用这个通用模块即可。

内容的提问来源于stack exchange,提问作者Nikolay Kulachenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:27