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

为何ViewModelProviders在lifecycle:extensions库?何时需引入viewmodel库?

解答你的两个ViewModel相关疑问

为什么ViewModelProviders属于lifecycle:extensions而非lifecycle:viewmodel?

这个设计是Android架构组件团队对核心类和工具扩展类的明确职责划分:

  • ViewModel本身是架构组件的核心基类,职责非常纯粹——存储与UI绑定的数据,并在屏幕旋转等配置变更时保留数据,所以被放在lifecycle:viewmodel(AndroidX环境下对应androidx.lifecycle:lifecycle-viewmodel)这个核心依赖库中。
  • ViewModelProviders则是一个封装性工具类,它的作用是简化ViewModel的实例化流程,自动帮你处理ViewModel与Fragment/Activity生命周期的绑定、实例缓存等逻辑。这类"便捷工具"不属于ViewModel的核心必要依赖,因此被归类到lifecycle:extensions库中——这个库专门存放各种简化架构组件使用的封装类。

另外补充个实用细节:目前ViewModelProviders已经被官方废弃,更推荐使用不带s的ViewModelProvider,写法示例如下:

private val viewModel: MyViewModel by lazy {
    ViewModelProvider(this)[MyViewModel::class.java]
}

这个新的ViewModelProvider已经包含在AndroidX的核心viewmodel库中,不需要额外引入extensions就能使用。

至于你提到Android Studio 3.6默认项目里ViewModel可以直接用,是因为默认模板的核心依赖(比如androidx.appcompat:appcompat)会间接依赖核心的viewmodel库,所以不需要手动添加依赖就能使用基类。

什么时候需要引入lifecycle:viewmodel库?

大部分常规Android项目中,核心依赖(比如appcompat、fragment)都会间接引入viewmodel库,因此不需要手动添加。但以下几种场景你需要手动引入:

  • 开发独立的Android库项目:如果你的库不依赖appcompat这类会传递viewmodel的上层依赖,就需要手动引入核心viewmodel库,才能让库内代码使用ViewModel基类。
  • 需要指定特定版本的viewmodel:如果项目中传递依赖的viewmodel版本不符合需求(比如要用到某个新版本的特性),可以手动引入指定版本的库来覆盖传递依赖的版本。
  • 维护旧的Support Library项目:如果你的项目还在使用旧版Support Library而非AndroidX,就需要引入android.arch.lifecycle:viewmodel(注意这是旧版架构库,和AndroidX的依赖包名不同)。

内容的提问来源于stack exchange,提问作者Elye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:52:40