为何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
相关产品推荐
相关产品推荐

