如何在Kotlin开发的Activity中访问共享ViewModel?
共享ViewModel的Activity侧正确实现方式
可以在Activity中访问共享ViewModel,你遇到的报错是因为by activityViewModels()是Fragment专属的Kotlin扩展方法,仅可在Fragment中调用,Activity中没有该扩展的实现。
最简单的实现方案(推荐)
使用AndroidX Activity KTX提供的viewModels()属性委托,和你在Fragment里的写法逻辑一致,都是懒加载获取ViewModel实例:
如果未引入依赖,先在Module级build.gradle的dependencies块中添加:
implementation "androidx.activity:activity-ktx:1.7.2" // 可替换为你需要的对应版本
之后在Activity中直接声明即可:
val model : SharedViewModel by viewModels()
注意:此处SharedViewModel为你定义的ViewModel类名,注意和变量名做区分,不要用小驼峰命名类
不使用KTX的原生实现
如果你不想引入KTX扩展,也可以直接用ViewModelProvider实现,代码如下:
val model = ViewModelProvider(this)[SharedViewModel::class.java]
实现原理解析
共享ViewModel的核心逻辑是所有持有者共用同一个ViewModel存储域:
- Fragment中使用
by activityViewModels()时,会把宿主Activity作为ViewModelStoreOwner来获取ViewModel实例 - Activity中初始化时把自身作为ViewModelStoreOwner,拿到的就是同一个实例,和所有子Fragment中的ViewModel完全共享数据
注意事项
- 不要在Activity的
onCreate生命周期之前访问ViewModel,使用属性委托的懒加载方式可以自动规避该问题 - 多Fragment和Activity同时操作ViewModel中的可观察数据(如LiveData、StateFlow)时,建议统一数据修改入口,避免出现数据异常
内容的提问来源于stack exchange,提问作者Yakin Wissem
相关产品推荐
相关产品推荐

