Viewmodel源码解析

本文深入解析Viewmodel在Android中的源码,探讨如何在配置变化时保持数据。从ActivityViewModelLazy、ViewModelProvider到ComponentActivity的onRetainNonConfigurationInstance,揭示Viewmodel在Activity重建后仍能保存数据的秘密。
摘要由CSDN通过智能技术生成

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 ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值