Viewmodel源码解析
现在Viewmodel相信大家都比较熟悉了,adnroid的官网上也介绍了它的一些特性。具体的这里就不多讲了。今天就来讲解它的源码,讲解为什么它能够在配置发生变化的时候还能保存数据。
现在在Activity和Fragment中怎么去初始化一个viewmodel呢?一般来讲就是通过谷歌给我们提供的扩展函数去初始化,具体如下
val plantingsViewModel:PlantListViewModel by viewModels()
所以今天,我就从这一个函数开始入手去看看Viewmodel内部是怎么实现的。
ActivityViewModelLazy.kt
//ActivityViewModelLazy.kt
@MainThread
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory //ViewModelProvider.Factory类型
}
//viewModelStore是ViewModelStore类型
return ViewModelLazy(VM::class, {
viewModelStore }, factoryPromise)
}
ViewModelProvider#ViewModelLazy
public class ViewModelLazy<VM : ViewModel> (
private val viewModelClass: KClass<VM>,
private val storeProducer: () -> ViewModelStore,
private val factoryProducer: () -> ViewModelProvider.Factory
) : Lazy<VM> {
private var cached: VM? = null
override val value: VM
//获取ViewModel
get() {
//将cache赋值给Viewmodel
val viewModel = cached
//如果viewmodel为空,那么就通过 ViewModelProvider.get方法返回viewmodel,并将cache赋值
return if (viewModel ==