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

news2024/10/7 20:30:30

一、介绍

        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传递的时候已封装好了。这就和你在页面间传递数据一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公链年度数据报告:2022年发生了什么,行业将走向何方?

Date&#xff1a;2023 年 1 月Data Source: Footprint Analytics - Chain overview这份年度链报告审视了过去一年 Footprint Analytics 上的数据&#xff0c;以分析各公链的关键趋势。在 2022 年&#xff0c;大多数加密货币头条新闻并不涉及链本身。虽然&#xff0c;像三箭、Bl…

SQLSERVER 的四个事务隔离级别到底怎么理解?

一&#xff1a;背景 1. 讲故事 在有关SQLSERVER的各种参考资料中&#xff0c;经常会看到如下四种事务隔离级别。 READ UNCOMMITTEDREAD COMMITTEDSERIALIZABLEREPEATABLE READ 随之而来的是大量的文字解释&#xff0c;还会附带各种 脏读, 幻读, 不可重复读 常常会把初学者弄…

【微信小程序学习第3天——网络数据请求

一、小程序网络请求限制 1、必须https类型的接口 2、必须将接口的域名添加到信任列表中 二、配置request合法域名 配置步骤&#xff1a;登录微信小程序管理后台 -> 开发 -> 开发设置 -> 服务器域名 -> 修改 request 合法域名 点击修改request合法域名&#xf…

全流程搞清楚 Kubernetes API 的使用,可进行业务二次开发对接 k8s 调用,详细图文说明以及常见问题整理

全流程搞清楚 Kubernetes API 的使用&#xff0c;可进行业务二次开发对接 k8s 调用&#xff0c;详细图文说明以及常见问题整理。 使用CLI&#xff08;如curl&#xff09;或GUI&#xff08;如postman&#xff09;HTTP客户端调用Kubernetes API有很多理由。例如&#xff0c;你可…

windows11改老版右键显示

右键显示效果&#xff1a;点击右键像windows10一样。方式一使用window的命令行操作&#xff1a;reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve1方式二使用注册表手动操作&#xff1a;win r&#xff1a;…

对话面试官:MySQL自增主键id快用完了怎么办?

前几天有个朋友出去面试&#xff0c;被面试官问到MySQL自增主键id用完了怎么办&#xff1f;由于对这块了解不多&#xff0c;所以回答得不太理想。 本篇文章为大家分享一下&#xff0c;MySQL自增主键达到上限以后会发生什么情况&#xff1f;该如何解决这种情况&#xff1f; 我们…

Python|每日一练|幂函数算法|位运算|>>右移|分析神器pysnooper|日志输出:Pow(x, n)

Pow(x, n) 实现 pow(x, n)(https://www.cplusplus.com/reference/valarray/pow/) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10输出&#xff1a;1024.00000 示例 2&#xff1a; …

漫画 | 程序员这次被逼上了绝路!

经过不懈努力&#xff0c;张大胖终于在一个小公司升任经理。张大胖回去翻阅资料&#xff0c;思考了一番&#xff0c;召开会议宣布了一项重要决定。会议室中一阵窃窃私语三天以后&#xff0c;张大胖进行检查&#xff0c;看看自己的第一把火成效如何。张大胖表示很满意&#xff0…

Elasticsearch:轻松处理 CSV 数据

我们知道 CSV 是一种非常流行的数据格式。在 Elastic Stack 中&#xff0c;我们有很多的方式来摄入 CSV 格式的数据。我们可以先看看一个常用的数据摄入数据流&#xff1a; 如上所示&#xff0c;我们可以采取不同的方法来对数据进行摄入。我们可以在不同的地方对数据进行处理。…

【My Electronic Notes系列——逻辑门电路】

目录 序言&#xff1a; &#x1f3c6;&#x1f3c6;人生在世&#xff0c;成功并非易事&#xff0c;他需要破茧而出的决心&#xff0c;他需要永不放弃的信念&#xff0c;他需要水滴石穿的坚持&#xff0c;他需要自强不息的勇气&#xff0c;他需要无畏无惧的凛然。要想成功&…

Java打印流(PrintStream/PrintWriter)

概念 打印流是输出信息最方便的类&#xff0c;注意包含字节打印流PrintStream和字符打印流PrintWriter。打印流提供了非常方便的打印功能&#xff0c;可以打印任何类型的数据信息&#xff0c;例如&#xff1a;小数&#xff0c;整数&#xff0c;字符串。而且永远不会抛出IOExce…

DPDK开发之KNI模块代码实现

DPDK开发之KNI模块代码实现背景KNI实现原理 -- ifreq代码实现总结背景 在DPDK开发的时候&#xff0c;如果有些协议不想处理&#xff0c;只处理关注的协议&#xff0c;可以把其他协议写回内核&#xff0c;让内核处理。此时的DPDK就起到分发的作用&#xff0c;类似一个过滤器。 …

二叉树遍历的C语言实现

1、二叉树 树是n个节点的有限集 每个节点事多有两颗子树的树称为 二叉树 该实验目标实现以下二叉树&#xff1a; 2、二叉树的遍历方案 设&#xff1a; D -- 访问根节点&#xff0c;输出根节点; L -- 递归遍历左二叉树; R -- 递归遍历右二叉树; 二叉树遍历方案…

1145. 二叉树着色游戏

有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不相同。 最开始时&#xff1a; 「一号」玩家从 [1, n] 中取一个值 x&#xff…

软件工程期末考试

软件工程一、简答题&#xff08;5个&#xff09;什么是软件危机&#xff1f;软件危机产生的原因是什么&#xff1f;怎样克服软件危机&#xff1f;你认为摆脱软件危机了吗&#xff1f;软件危机&#xff1a;是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它…

QT opencv 学习day01 安装opencv ,

1. 安装opencv 教程 看这个大佬的链接 &#xff08;实测有用&#xff09;&#xff08;操作简单&#xff09; 链接&#xff1a; (1条消息) 【OpenCV】windows Qt环境搭建_logani的博客-CSDN博客 2. 使用opencv 的注意事项 1.首先要在工程文件 .pro 文件里面 加入路径&#x…

Springboot+Echarts实现数据可视化项目

首先,得明白 springboot 需要写什么内容? 先理解下 MVC 模式! bean 层 也称之为 Dao 层 包括XxxMapper.java(数据库访问接口类),XxxMapper.xml(数据库链接实现);mapper 层 也称之为 model层,模型层,entity层,实体层 就是数据库表的映射实体类,存放POJO对象;servi…

Nginx反向代理与负载均衡

一.何为反向代理? 在介绍反向代理之前&#xff0c;先来了解一下正向代理。 正向代理&#xff1a;如果把局域网外的Internet想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问Internet&#xff0c;则需要通过代理服务器来访问&#xff0c;这种代理服务就称为正向代…

【前端利器炫酷的CodePen】

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

java集合: ArrayList的底层机制和使用方法

文章目录引言一、Arraylist是什么&#xff1f;二、Arraylist的底层扩容机制(面向面试)1.扩容机制2.扩容过程:3步骤3.注意事项三、使用步骤1.ArrayList类引入2.添加元素3.删除元素4.计算大小5.其他的引用类型6.ArrayList 排序7.ArrayList的遍历方法8.Java ArrayList 方法表格引言…