一、介绍

        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数据保存之详解与使用。

五、默认参数 DefaultCreationExtras

 既然我们介绍了CreationExtras,自然需要用起来,如何来构建?

第一:fragment或者Activity中

在这两个类中,已提供了getDefaultViewModelCreationExtras()来获取

Android MVVM之CreationExtras创建ViewModel的详解与使用_ide

 

Android MVVM之CreationExtras创建ViewModel的详解与使用_ide_02

        默认构建出来的是一个空的。只提供了读方法,无法写入,这个时候我们需要set进去,就需要重写这个方法或者自己重新构建一个。

 

override fun getDefaultViewModelCreationExtras(): CreationExtras {


        val extras = MutableCreationExtras()
        if (application != null) {
            extras.set(
                ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY,
                application
            )
        }
        
     
        return extras

    }

        如果你想通过CreationExtras 来保存什么,都可以在MutableCreationExtras这里新增,MutableCreationExtras这个已在CreationExtras中提供了。

Android MVVM之CreationExtras创建ViewModel的详解与使用_泛型_03

 MutableCreationExtras可以支持哪些,可以看CreationExtras的访问键值 ,上面第四模块。

六、总结:

        通过CreationExtras以及ViewModelProvider.Factory,我们可以闭环CreationExtras在viewModel中的使用,以及如何使用。包括在Mvvm中,如何去创建以及保存,这样就可以很好的进行业务剥离,达到CreationExtras设计初心。

        在ViewModelProvider.Factory的oncreate中,通过CreationExtras获取的前提是CreationExtras传递的时候已封装好了。这就和你在页面间传递数据一样。