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 } }
错误分析与解决办法
核心问题:注释掉了Dagger注入代码
你把(application as PWEApplication).daggerComponent.inject(this)这行代码注释掉了,这是Dagger完成Activity中@Inject字段注入的关键代码。没有这行,Dagger不会自动初始化viewModelFactory,直接使用就会触发未初始化的报错。解决步骤
- 取消注释上述注入代码,并且要确保这行代码在
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) // ... 剩余代码 }
- 取消注释上述注入代码,并且要确保这行代码在
额外检查项
- 确认你的
PWEApplication中的daggerComponent已经正确初始化,并且Dagger Component接口中声明了fun inject(activity: MainActivity)方法。 - 确保
ViewModelFactory已经被正确加入Dagger的依赖图:如果是自定义Factory,需要在Module中用@Provides提供;如果用的是Dagger官方的ViewModel Factory扩展,要确保依赖配置正确。
- 确认你的
内容的提问来源于stack exchange,提问作者kathir
相关产品推荐
相关产品推荐

