Dagger 2.15:无法在DaggerApplication类中注入依赖怎么办?
你遇到的核心问题是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,提问作者

