Jetpack组件——ViewModel

ViewModel 简介

ViewModel 即是 MVVM 架构中的 VM 部分。ViewModel 专门用于存放应用程序页面所需的数据,它是连接 View 和 Model 的桥梁,使得数据和视图既能够互相分离又能互相通信。

ViewModel 的生命周期

ViewModel 的生命周期如下图所示:
在这里插入图片描述

在旋转屏幕的时候,Activity 会经历一次销毁与重新创建的过程,此时原本保存在 Activity 中的数据就会丢失,我们需要考虑此种场景下的数据的储存于恢复问题。但是通过 ViewModel 可以很好的解决这个问题,从上面的 ViewModel 生命周期图可以看到由屏幕旋转导致的 Activity 重建并不会影响 ViewModel 的生命周期。

ViewModel 的使用

1、添加依赖

首先在 app/build.gradle 文件中添加下面的依赖

dependencies{
    
    
	...
	implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}

2、创建 ViewModel

为 Activity 和 Fragment 创建对应的 ViewModel,需要继承 ViewModel 类,示例如下:

class MyViewModel: ViewModel() {
    
    
}

3、获取 ViewModel 实例

在 Activity 和 Fragment 中通过 ViewModelProvider 获取 ViewModel 的实例,示例如下:

ViewModelProvider(this).get(MyViewModel::class.java)

说明:

  • this 时指 Activity 或者 Fragment 实例
  • MyViewModel 即为创建的 ViewModel 类

注:不可以直接创建 ViewModel 的实例,一定要通过 ViewModelProvider 去获取 ViewModel 的实例,因为 ViewModel 有其独立的生命周期,并且其生命周期长于 Activity 的生命周期。

4、向 ViewModel 传递参数

有时候我们需要的创建ViewModel 的时候通过其构造函数来传递一些参数,但是 ViewModel 的实例都是通过 ViewModelProvider 来获取的,我们没有办法直接调用其构造函数来传递参数,因此我们需要借助 ViewModelProvider.Factory 来实现参数传递,示例如下:
修改 MyViewModel 类,添加构造函数:

class MyViewModel(temp: Int): ViewModel() {
    
    
}

新建 MyViewModelFactory 类,实现 ViewModelProvider.Factory 接口:

class MyViewModelFactory(private val temp: Int): ViewModelProvider.Factory {
    
    
	override fun <T: ViewModel> create(modelClass: Class<T>): T{
    
    
		return MyViewModel(temp) as T
	}
}

然后创建实例:

ViewModelProvider(this, MyViewModelFactory(4)).get(MyViewModel::class.java)

猜你喜欢

转载自blog.csdn.net/qingyunhuohuo1/article/details/111869012