Dagger2简单实例实现问题:testClass为空,求排查方案
问题根源
你已经搭好了App层面的Dagger组件,但忘了告诉Dagger要处理MainActivity的注入逻辑,也没在Activity里触发注入流程,导致@Inject lateinit var testClass一直处于未初始化状态。
修复步骤
1. 添加Activity注入模块
首先创建一个ActivityModule.kt,用Dagger的@ContributesAndroidInjector注解声明MainActivity需要被注入:
@Module abstract class ActivityModule { @ContributesAndroidInjector abstract fun contributeMainActivity(): MainActivity }
这个注解会让Dagger自动生成MainActivity的子组件,专门负责注入Activity内的依赖。
2. 更新AppComponent,加入ActivityModule
把刚才的ActivityModule加到AppComponent的modules列表里,让Dagger关联App和Activity的注入逻辑:
@Singleton @Component(modules = [ AndroidInjectionModule::class, AppModule::class, ActivityModule::class // 新增这一行 ]) interface AppComponent : AndroidInjector<App> { @Component.Builder interface Builder { @BindsInstance fun application(app: App): Builder fun build(): AppComponent } }
3. 在MainActivity里触发注入
在onCreate方法的最开头(调用super.onCreate之前)执行AndroidInjection.inject(this),让Dagger完成注入操作:
class MainActivity : AppCompatActivity() { @Inject lateinit var testClass: TestClass override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) // 必须加这一行! super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onResume() { super.onResume() val x = testClass.getRandomValueFromCTest() } }
4. 简化AppModule(可选但推荐)
你的TestClass和TestOperator已经有@Inject构造函数了,Dagger可以自动创建它们的实例,所以AppModule里的这两个@Provides方法完全多余,可以删掉:
@Module class AppModule { @Provides @Singleton fun provideApplication(app: App): Application = app // 删掉下面两个冗余的@Provides,Dagger会自动处理实例创建 // @Provides // @Singleton // fun provideTestOperator(testOperator: TestOperator) = testOperator // @Provides // @Singleton // fun provideTestClass(testClass: TestClass) = testClass }
为什么之前会报错?
Koin是通过by inject()或get()直接主动获取实例,而Dagger是被动注入到目标类中——需要明确告诉Dagger哪些类需要被注入,并且在类的生命周期内触发注入操作。你之前只配置了App层面的组件,但Activity的注入流程完全没启动,所以testClass一直是未初始化的lateinit变量,调用方法时就会抛出null相关异常。
内容的提问来源于stack exchange,提问作者pawer

