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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:24:05