环境AndroidStudio4.1.2 / Kotlin1.4.20 / ViewModel-2.2.0
引入依赖
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
来看一下开发者文档里面关于viewModel的使用示例
这里为了简单起见,不引入liveData
创建自己的viewModel 继承自ViewModel类
class MainViewModel():ViewModel() {
var counter=0
}
上图(注意红框区域)中可得知,推荐使用activity-ktx扩展库中的代理方式实例化viewModel
对应地址https://developer.android.google.cn/jetpack/androidx/releases/activity
引入activity-ktx库
def activity_version = "1.1.0"
implementation "androidx.activity:activity-ktx:$activity_version"
1 --->>> 在activity中实例化viewModel (无参实例化方式)
private val viewModelWithOutInit:MainViewModel by viewModels()
context中获得实例后即可使用
viewModelWithOutInit.counter++
2 --->>>有参实例化方式
private val viewModelWithOutInit:MainViewModel by viewModels()
点击进入上例行尾 viewModels 函数,可知通过该函数接收一个 实现了factory接口的自定义Factory对象 用于定制实例化方式 ,如下图
@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
return ViewModelLazy(VM::class, { viewModelStore }, factoryPromise)
}
创建viewModel工厂类并继承factory接口,构造方法中接收一个int类型的入参,通过create方法传递给ViewModel
class MainViewModelFactory(private val countReserved:Int):ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MainViewModel(countReserved) as T
}
}
改写自定义ViewModel的构造方法
class MainViewModel(countReserved:Int):ViewModel() {
var counter=countReserved
}
activity中实例化
private val viewModel: MainViewModel by viewModels {
MainViewModelFactory(100))
}