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

Android Kotlin+Dagger报错:lateinit属性viewModelFactory未初始化求解决

问题:lateinit property viewModelFactory has not been initialized

我是Android Kotlin和Dagger新手,遇到报错lateinit property viewModelFactory has not been initialized。我已提供ViewModelFactory,但仍出现该问题,不清楚原因。现附上相关类代码,恳请帮忙找出错误并解决。

MainActivity.kt

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var viewModelFactory: ViewModelFactory

    private lateinit var reportViewModel: ReportsViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //(application as PWEApplication).daggerComponent.inject(this)
        reportViewModel = ViewModelProvider(this, viewModelFactory).get(ReportsViewModel::class.java)
        reportViewModel.report.observe(this, Observer {
            when(it.status){
                NetworkResource.Status.LOADING -> {
                    // 显示加载指示器
                }
                NetworkResource.Status.SUCCESS -> {
                    // 展示API返回的数据
                    Log.e("installationReport",""+it.data)
                }
                NetworkResource.Status.ERROR -> {
                    // 显示错误提示
                }
            }
        })
    }
}

ReportsViewModel.kt

open class ReportsViewModel @Inject constructor(private val repository: ReportsRepository) : ViewModel() {

    private var reportLiveData = MediatorLiveData<ReportRequest>()

    val report = Transformations.switchMap(reportLiveData) {
        repository.getReports(it)
    }

    fun getInstallReport(idd: Int, fromDate: String, toDate: String) {
        reportLiveData.value = ReportRequest(idd, fromDate, toDate)
    }
}

ReportsRepository.kt

class ReportsRepository @Inject constructor(
    private val reportServiceNS: ReportsService,
    private val schedulerProvider: SchedulerProvider
) {
    private val reportsMutableLiveData = MutableLiveData<NetworkResource<List<ResponseItem>>>()
    private var disposable: Disposable? = null

    fun getReports(reportRequest: ReportRequest): MutableLiveData<NetworkResource<List<ResponseItem>>> {
        disposable = reportServiceNS.getReport(
            reportRequest.script,
            reportRequest.deploy,
            reportRequest.compId,
            reportRequest.h,
            reportRequest.discId,
            reportRequest.fromDate,
            reportRequest.toDate)
            .compose(schedulerProvider.getSchedulersForObservable())
            .subscribeWith(object : DisposableObserver<ReportResponse>() {
                override fun onComplete() {

                }

                override fun onNext(t: ReportResponse) {
                    reportsMutableLiveData.value = NetworkResource.success(t.complaintData)
                }

                override fun onError(e: Throwable) {
                    reportsMutableLiveData.value = NetworkResource.error(e, null)
                }

            })

        return reportsMutableLiveData
    }
}

错误分析与解决办法

  1. 核心问题:注释掉了Dagger注入代码
    你把(application as PWEApplication).daggerComponent.inject(this)这行代码注释掉了,这是Dagger完成Activity中@Inject字段注入的关键代码。没有这行,Dagger不会自动初始化viewModelFactory,直接使用就会触发未初始化的报错。

  2. 解决步骤

    • 取消注释上述注入代码,并且要确保这行代码在reportViewModel = ViewModelProvider(...)之前执行,示例:
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)
      
          // 恢复注入代码
          (application as PWEApplication).daggerComponent.inject(this)
          // 之后再初始化ViewModel
          reportViewModel = ViewModelProvider(this, viewModelFactory).get(ReportsViewModel::class.java)
          // ... 剩余代码
      }
      
  3. 额外检查项

    • 确认你的PWEApplication中的daggerComponent已经正确初始化,并且Dagger Component接口中声明了fun inject(activity: MainActivity)方法。
    • 确保ViewModelFactory已经被正确加入Dagger的依赖图:如果是自定义Factory,需要在Module中用@Provides提供;如果用的是Dagger官方的ViewModel Factory扩展,要确保依赖配置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:46:46