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

Dagger 2.15:无法在DaggerApplication类中注入依赖怎么办?

解决DaggerApplication中依赖注入为Null的问题

你遇到的核心问题是Dagger没有正确识别并注入App子类中的mSomeClass字段,导致它始终为null。这是因为你的AppComponent是针对父类DaggerApplication的注入器,而非你自定义的App类,Dagger无法自动处理子类的注入逻辑。

下面是具体的修复步骤:

1. 修改AppComponent的继承目标

把AppComponent的继承类型从AndroidInjector<DaggerApplication>改为AndroidInjector<App>,让Dagger明确要为你的自定义App类生成注入代码:

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    ViewModelFactoryModule::class,
    BuildersModule::class
])
interface AppComponent : AndroidInjector<App> { // 此处改为App而非DaggerApplication
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }
}

2. 确保App类的注入器类型匹配

调整applicationInjector方法的返回逻辑,保证和Component的类型一致(虽然返回值声明可以保留AndroidInjector<out DaggerApplication>,但内部构建的是针对App的注入器):

class App : DaggerApplication() {
    @Inject lateinit var mSomeClass: SomeClass

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().application(this).build()
    }

    override fun onCreate() {
        super.onCreate()
        // 现在mSomeClass应该已被正确注入
        mSomeClass.initialize()
    }
}

问题根源说明

DaggerApplication会在onCreate执行前调用applicationInjector().inject(this)完成注入,但如果你的Component只针对DaggerApplication父类,它只会扫描父类中的@Inject字段,完全不知道你在App子类中添加的mSomeClass,自然不会对其注入,导致字段为null。

将Component的目标改为App类后,Dagger会扫描这个子类的所有@Inject字段并生成对应注入逻辑,保证mSomeClass在onCreate调用前完成初始化。

另外从你给出的代码看,AppModule中的provideSomeClass方法是正常的,SomeClass的实例提供逻辑没有问题,核心问题就是Component的目标类型不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:52