viewModelScope.launch提示Unresolved reference编译无错运行崩溃怎么解决
问题原因
- ViewModel继承关系错误:你的
NotesViewModel构造函数传入了Application上下文,但却继承了普通ViewModel类,同时注释掉了AndroidViewModel的导入语句。普通ViewModel不支持接收Application参数,会导致ViewModel实例化失败,运行时崩溃,同时会引发IDE对类成员的引用识别异常。 - 协程依赖版本冲突:build.gradle中重复声明了协程依赖,同时通过项目级变量
$rootProject.coroutines和硬编码1.5.0两种方式引入了协程核心库和Android扩展库,两个来源的版本如果不一致会导致类加载冲突,编译阶段可以通过但运行时找不到launch方法对应的类定义,同时IDE会报未解析引用。 - IDE索引缓存损坏:Android Studio的索引缓存异常时,也会出现代码实际可编译,但IDE错误提示未解析引用的问题。
- 依赖版本过低:如果你的
lifecycle-viewmodel-ktx版本低于2.2.0,或者协程版本低于1.3.0,也会不支持viewModelScope和对应的协程API。
解决方案
- 修正ViewModel继承逻辑
将NotesViewModel的父类替换为AndroidViewModel,取消对应导入的注释,修改后的代码如下:
package com.example.mynotes import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class NotesViewModel(application: Application) : AndroidViewModel(application) { private val repository : NotesRepository val allNotes : LiveData<List<Notes>> init { val dao = NotesDatabase.getDatabase(application).getNotesDao() repository = NotesRepository(dao) allNotes = repository.allNotes } fun deleteNotes(notes: Notes) = viewModelScope.launch(Dispatchers.IO) { repository.delete(notes) } }
- 清理重复依赖,统一版本号
删除build.gradle中重复的硬编码协程依赖,保留统一变量控制的版本即可:
// 删除以下两行重复的依赖声明 // implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' // implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
同时确认项目级build.gradle中配置的lifecycleVersion不低于2.2.0,coroutines版本不低于1.3.0。
- 清理IDE缓存重建项目
依次点击Android Studio菜单栏File -> Invalidate Caches... -> Invalidate and Restart,等待IDE重启完成后重新构建项目,即可消除IDE的异常提示。
内容的提问来源于stack exchange,提问作者Kratikpal Singh
相关产品推荐
相关产品推荐

