一、介绍
CreationExtras是Android api在Androidx-Lifecycle 在近期迈入到了 2.5.0 版本中。很多人第一眼看到,不知道这是个什么,看到会觉得云里雾里,无从下手,也不知道到底该怎么做。这个和现有的ViewModel搭配使用。他不能单独使用,也是被包含在ViewModelProvider.Factory里。
二、CreationExtras的接入
该类已在:
def lifecycle_version = "2.5.0" // ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version")
如果你采用默认的版本,可能还是处于2.2.1或者2.3.1,无法使用CreationExtras,请升级
源码:
public abstract class CreationExtras internal constructor() {
internal val map: MutableMap<Key<*>, Any?> = mutableMapOf()
/**
* Key for the elements of [CreationExtras]. [T] is a type of an element with this key.
*/
public interface Key<T>
/**
* Returns an element associated with the given [key]
*/
public abstract operator fun <T> get(key: Key<T>): T?
/**
* Empty [CreationExtras]
*/
object Empty : CreationExtras() {
override fun <T> get(key: Key<T>): T? = null
}
}
一个抽象类,提供了一个map的存储机制。这个Key<T>是key的泛型对象,并且是集合,不要被
MutableMap<Key<*>, Any?>这个误导
三、ViewModelProvider.Factory介绍
在viewModel的文章已,也有介绍过ViewModelProvider.Factory提供创建机制,在2.5.1后,viewModel的创建提供了两个方法。
1.before 2.5.0
override fun <T : ViewModel> create(modelClass: Class<T>): T
2.after
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T
这里面的T是viewModel的泛型,最终返回的都是我们的viewmodel
第一种:
直接传入我们定义的viewModel即可。
第二种:
多了一个参数CreationExtras,这就是我们今天要讲的创建机制提供的扩展。可以通过这个扩展抽象类来完成一些数据的传递
四、包含 CreationExtras 的 ViewModel
如果 ViewModel 类在其构造函数中接收依赖项,请提供用于实现 ViewModelProvider.Factory 接口的工厂。替换 create(Class<T>, CreationExtras) 函数以提供 ViewModel 的新实例。
借助 CreationExtras,您可以访问有助于实例化 ViewModel 的相关信息。下面列出了可以通过 extra 访问的键:
键 | 功能 |
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY | 提供对您传递给 |
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY | 提供对 |
SavedStateHandleSupport.DEFAULT_ARGS_KEY | 提供对您在构造 |
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY | 提供对用于构造 |
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY | 提供对用于构造 |
如需创建 SavedStateHandle 的新实例,请使用 CreationExtras.createSavedStateHandle().createSavedStateHandle()) 函数并将其传递给 ViewModel。
val application = checkNotNull(extras[APPLICATION_KEY])
// Create a SavedStateHandle for this ViewModel from extras
val savedStateHandle = extras.createSavedStateHandle()
关于:SavedStateHandle的使用,可以看我的另一篇文章
如果在viewModel需要存储,可以借助SavedStateHandle来完成。Android MVVM之SavedStateHandle数据保存之详解与使用。
五、默认参数 DefaultCreationExtras
既然我们介绍了CreationExtras,自然需要用起来,如何来构建?
第一:fragment或者Activity中
在这两个类中,已提供了getDefaultViewModelCreationExtras()来获取
默认构建出来的是一个空的。只提供了读方法,无法写入,这个时候我们需要set进去,就需要重写这个方法或者自己重新构建一个。
override fun getDefaultViewModelCreationExtras(): CreationExtras {
val extras = MutableCreationExtras()
if (application != null) {
extras.set(
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY,
application
)
}
return extras
}
如果你想通过CreationExtras 来保存什么,都可以在MutableCreationExtras这里新增,MutableCreationExtras这个已在CreationExtras中提供了。
MutableCreationExtras可以支持哪些,可以看CreationExtras的访问键值 ,上面第四模块。
六、总结:
通过CreationExtras以及ViewModelProvider.Factory,我们可以闭环CreationExtras在viewModel中的使用,以及如何使用。包括在Mvvm中,如何去创建以及保存,这样就可以很好的进行业务剥离,达到CreationExtras设计初心。
在ViewModelProvider.Factory的oncreate中,通过CreationExtras获取的前提是CreationExtras传递的时候已封装好了。这就和你在页面间传递数据一样。