Android Hilt开发调用activityViewModels()出现未解析引用问题求助
Hilt下activityViewModels未解析引用问题解决方案
问题排查与解决步骤
确认API使用场景合理性
by activityViewModels()是AndroidX Fragment库提供的Fragment专属扩展函数,仅可在Fragment中调用,作用是获取当前Fragment依附的宿主Activity对应的ViewModel实例。若你直接在Activity代码中编写该语句,本身不存在对应API,必然会提示未解析引用。
若你需要在Activity中直接获取ViewModel实例,替换为by viewModels()即可。补全缺失的依赖
如果你确认是在Fragment中调用仍报错,说明缺少Fragment KTX扩展依赖,在app模块
build.gradle的dependencies节点添加如下配置即可:implementation "androidx.fragment:fragment-ktx:1.5.7" // 版本可根据你的项目compileSdk版本适配调整,只要不低于你当前其他AndroidX依赖的版本即可修正Hilt配置与ViewModel注解
- 你当前引入的
androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03属于已废弃的过时依赖,高版本Hilt已经将ViewModel注入能力整合到核心包中,直接删除该依赖即可,无需单独引入。 - 你的
SelectWifiViewModel类必须添加@HiltViewModel注解,且构造函数添加@Inject注解,示例如下:@HiltViewModel class SelectWifiViewModel @Inject constructor() : ViewModel() { // 你的业务逻辑 } - 所有用到该ViewModel的Activity、Fragment都必须添加
@AndroidEntryPoint注解,Hilt才能正常完成实例注入。
- 你当前引入的
额外说明:跨Activity共用ViewModel的需求实现
你当前的思路存在误区:activityViewModels()只能实现同一个Activity下的多个Fragment共用ViewModel,无法实现两个不同的Activity共用同一个ViewModel。ViewModel的生命周期和所属的Activity完全绑定,不同Activity的ViewModel实例是相互隔离的。
如果需要跨Activity共享数据,可采用以下方案:
- 使用全局单例类存储共享数据,配合生命周期监听在合适的时机清理数据避免内存泄漏
- 将共享数据持久化到SharedPreferences、数据库等存储层,两个Activity都从存储层读写数据
- 自定义继承自ViewModel的全局实例,绑定Application生命周期,注意使用时避免内存泄漏
内容的提问来源于stack exchange,提问作者Emanuel Garcia
相关产品推荐
相关产品推荐

