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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:31