深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
ViewModelStore
:用于存储ViewModel实例的类,内部持有一个HashMap保存实例,ViewModelProvider
会将创建好的ViewModel实例保存到ViewModelStore
中,之后再需要此类ViewModel的实例时就直接从中读取。ViewModelProvider.Factory
:前文已经提到,这是用于创建ViewModel实例的工厂,ViewModelProvider
当需要ViewModel的实例又在ViewModelStore
中没有找到对应实例时就会调用工厂的create
方法创建。CreationExtras
:前文也已提到,它用于在创建ViewModel实例时从外界向构造过程传递参数,内部持有一个MutableMap,以key-value的形式存储和查找参数。
虽然ViewModelProvider
需要三个参数来构造,但在实际使用中我们往往只在构造时传递了一个ViewModelStoreOwner
,ViewModelStoreOwner
很好理解,可以用来提供ViewModelStore
,而剩下两个参数,框架则提供了一系列的默认规则。
public constructor(
owner: ViewModelStoreOwner
) : this(owner.viewModelStore, defaultFactory(owner), defaultCreationExtras(owner))
ViewModelStore的获取
通常情况下ViewModelStore
由ViewModelStoreOwner
提供,ViewModelStoreOwner
是一个接口,里面只声明了一个getViewModelStore
函数。androidx里的ComponentActivity
、Fragment
、FragmentViewLifecycleOwner
等都实现了这个接口,下面我们看一看ComponentActivity
中是如何实现的:
public ViewModelStore getViewModelStore() {
ensureViewModelStore();
return mViewModelStore;
}
void ensureViewModelStore() {
if (mViewModelStore == null) {
NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance();
// 这里会尝获取配置变更前保存的实例,这是ViewModel在配置变更后仍能保持数据的关键
if (nc != null) {
mViewModelStore = nc.viewModelStore;
}
if (mViewModelStore == null) {
mViewModelStore = new ViewModelStore();
}
}
}
默认工厂和及构造参数
defaultFactory
, defaultCreationExtras
用于提供默认的ViewModelProvider.Factory
与CreationExtras
。
internal fun defaultFactory(owner: ViewModelStoreOwner): Factory =
if (owner is HasDefaultViewModelProviderFactory)
owner.defaultViewModelProviderFactory
else instance
internal fun defaultCreationExtras(owner: ViewModelStoreOwner): CreationExtras =
if (owner is HasDefaultViewModelProviderFactory) {
owner.defaultViewModelCreationExtras
else CreationExtras.Empty
可以看到,两个方法首先都尝试将ViewModelStoreOwner
实例转为HasDefaultViewModelProviderFactory
,然后从中获取对应的默认值。如果没获取到,则返回ViewModelProvider
自己提供的默认值。
先来看下ViewModelProvider
提供的默认值:
public open class NewInstanceFactory : Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return try {
modelClass.newInstance()
} catch (...) {
...
}
}
public companion object {
private var sInstance: NewInstanceFactory? = null
public val instance: NewInstanceFactory get() {