Android MVVM之CreationExtras创建ViewModel的详解与使用
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
一、介绍
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.get() 的自定义键的访问权限。 |
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY | 提供对 Application 类实例的访问权限。 |
SavedStateHandleSupport.DEFAULT_ARGS_KEY | 提供对您在构造 SavedStateHandle 时应使用的参数 bundle 的访问权限。 |
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY | 提供对用于构造 ViewModel 的 SavedStateRegistryOwner 的访问权限。 |
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY | 提供对用于构造 ViewModel 的 ViewModelStoreOwner 的访问权限。 |
如需创建 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数据保存之详解与使用。_蜗牛、Z的博客-CSDN博客
五、默认参数 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传递的时候已封装好了。这就和你在页面间传递数据一样。