Dagger2 + Kotlin 问题:lateinit 属性未初始化
解决lateinit property viewModelFactory未初始化的问题
你遇到的这个错误核心原因很明确:你没有在MainActivity中触发Dagger的注入流程,导致被@Inject标注的viewModelFactory一直没被初始化。另外你的ViewModel变量初始化也存在问题,我来一步步帮你修正:
1. 先修复注入触发的问题
在MainActivity的onCreate方法最开始,需要调用Application中的AppComponent来完成当前Activity的注入操作。修改你的MainActivity.kt:
class MainActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: MainViewModelFactory // 修正ViewModel变量的声明方式,避免初始化为null private lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 关键步骤:触发Dagger注入,初始化viewModelFactory TweetSentimentsApplication.appComponent.inject(this) setContentView(R.layout.main_activity) // 现在可以正常使用viewModelFactory获取ViewModel并赋值 viewModel = ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java) viewModel.init("guuilp") viewModel.getTweetList().observe(this, Observer { Toast.makeText(this, it?.size.toString(), Toast.LENGTH_LONG).show() }) } }
2. 检查其他潜在配置
- 确保你的
TweetSentimentsApplication已经在AndroidManifest.xml中注册,否则Dagger的Component无法正常初始化:<application android:name=".TweetSentimentsApplication" <!-- 其他原有属性 --> > <!-- 活动声明 --> </application> - 确认项目中已经正确配置KAPT插件(用于生成Dagger相关代码),在模块级
build.gradle中应该有类似配置:plugins { id 'kotlin-kapt' }
错误原因复盘
Dagger不会自动完成注入操作,必须显式调用component.inject(this)来告知Dagger为当前类的@Inject字段赋值。你之前的代码仅声明了要注入viewModelFactory,但未触发注入动作,导致lateinit变量始终未初始化,最终抛出异常。
另外,你之前将viewModel初始化为null,即便viewModelFactory正常初始化,后续的viewModel?.init也不会执行,这部分我也一并帮你修正了。
内容的提问来源于stack exchange,提问作者Guilherme Lima Pereira
相关产品推荐
相关产品推荐

