本文翻译自:https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f

朋友们好,今天我向大家介绍下 ViewModel 中如何使用 ViewModelProvider.Factory.


现在开始

所以,我们首要问题是:什么是 ViewModelProvider.Factory ?让我们在不使用 ViewModelProvider.Factory 的情况下,试着创建一个 ViewModel 看看:

在活动中实例化:

有没有人注意到:当我们使用 ViewModelProviders 在活动中实例化 MyViewModel 时,从未没用过 MyViewModel 的构造方法,而都是使用 ViewModelProviders 这个类中的方法。ViewModelProviders 在内部为我们管理并调用 ViewModel 的主构造函数,创建viewmodel的实例并将该实例并返回。

那么,现在让我们看看,如果我们直接把参数传递给 MyViewModel 类的构造方法时会发生了什么:

现在,我们在活动中创建 MyViewModel 实例:

太棒了!没有发生任何错误

但是,等等。

当你运行上面这段代码的时候,你收到了 RunTimeError。程序崩溃了!!! RuntimeException 不能创建出 MyViewModel 实例。

现在我们为什么会发生这些。ViewModelProviders 的 of() 方法,在内部创建了默认的 ViewModelProvider.Factory ,从而实现了 ViewModel 的无参创建。所以,当我们在构造方法添加参数时, ViewModelProvider.Factory 的内部无法实例化 ViewModel 对象,因为 ViewModelProvider.Factory 调用主构造方法创建 ViewModel’s 实例而失败。下图是 ViewModelFactory ViewModelFactory 的默认实现。


如果你想在构造方法中添加参数,你需要编写自己的 ViewModelProvider 来创建 ViewModel 实例。

什么是 ViewModelProvider.Factory?

ViewModelProviders.Factory 接口是负责实例化 ViewModels 对象的启动装置。这意味着你需要自己写实例化 ViewModel 对象的方法。

让我们像下面这样创建自己的 ViewModelProvider.Factory :

这里有几点需要记下:

  1. 你需要通过构造方法或者其他你喜欢的途径(比如 Singleton, FactoryPattern 等等)。这是由于你在实例化 ViewModel 对象时,不能直接在活动或者碎片中调用 ViewModel 的构造方法,而且你又想去设置 ViewModel 构造方法的参数,因此你需要将参数传入 ViewModelProvider.Factory 它将会帮你创建你的 ViewModel。
  2. ViewModelProvider.Factory 是一个包含 create 方法的接口。这个 create 方法负责创建你的 VeiwModel’s 实例。
  3. modelClass.getConstructor(Int::class.java) 方法是一个整型的能够通过调用 newInstance 方法来想构造方法传值的方法。

现在就让我们通过 ViewModelProvider.Factory 在活动中创建 ViewModel 实例。

我们将参数或者依赖关系转入我们的 ViewModelProvider.Factory 以便于它能够为我们创建 ViewModel,ViewModelProviders.of( context, instanceOfViewModelFactory) 方法获得我们 ViewModelProvider.Factory 实例,现在就像之前的例子中一样,我们已经学会了创建 ViewModel 实例的过程。

所以,为什么我们需要 ViewModelProvider.Factory ?

我们心中有这样一些疑问,我们不能直接在活动或碎片中将值传入 ViewModel 构造方法中去,我需要写法来设置我们的参数值使其正常工作,这就是为什么我们需要 ViewModelProver.Factory,在一些情况下你可以不使用,但在某些特定情形下,你需要使用 ViewModelProver.Factory。

什么时候使用 ViewModelProvider.Factory

当你的 ViewModel 有依赖项,并且你需要将这些依赖项通过构造方法传入,因此,您可以模拟该依赖项并测试 ViewModel。

什么时候不应该使用 ViewModelProvider.Factory

如果你的 ViewModel 没有依赖项,这时你就不需要去自己创建 ViewModelProvider.Factory。系统自带的方法,注意帮助你创建 ViewModel。

总结

ViewModelProvider.Factory 负责帮你创建 ViewModel 实例。当你的 ViewModel 存在依赖项,且你希望测试你的 ViewModel 时,你需要创建自己的 ViewModelProvider.Factory 来通过 ViewModel 的构造方法传递依赖项,将你的数值传入 ViewModelProvider.Factory 实例中去

你的关注是我最大的动力!

ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者的更多相关文章

  1. Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    # 什么是 Room ? 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Archit ...

  2. 每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM

    # 由来 在我们编写 Android 程序的时候,几乎永远逃避不了图片压缩的难题.除了应用图标之外,我们所要显示的图片基本上只有两个来源: 来自网络下载 本地相册中加载 不管是网上下载下来的也好,还是 ...

  3. Android笔记之ViewModel的使用示例

    依赖 implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'com.squareup.retrofit2:r ...

  4. Android Jetpack组件 - ViewModel,LiveData使用以及原理

    本文涉及的源码版本如下: com.android.support:appcompat-v7:27.1.1 android.arch.lifecycle:extensions:1.1.1 android ...

  5. Android架构组件——ViewModel

    概述 ViewModel,从字面上理解的话,它肯定是跟视图(View)以及数据(Model)相关的.正像它字面意思一样,它是负责准备和管理和UI组件(Fragment/Activity)相关的数据类, ...

  6. Jetpack架构组件学习(2)——ViewModel和Livedata使用

    要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...

  7. ViewModel的创建

    ViewModel的创建 ViewModel本身只是ViewModel这个类的子类: class MainViewModel: ViewModel() { } 在屏幕旋转UI重建的时候, 它是如何拥有 ...

  8. 改造 Android 官方架构组件 ViewModel

    前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, ...

  9. Jetpack 架构组件 LiveData ViewModel MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. HDU 6313

    题意略. 思路:数论题. #include<bits/stdc++.h> using namespace std; ; const int maxn = p * p; ][maxn + ] ...

  2. SPSS数据分析方法不知道如何选择

      一提到数学,高等数学,线性代数,概率论与数理统计,数值分析,空间解析几何这些数学课程,头疼呀.作为文科生,遇见这些课程时,通常都是各种寻求帮助,班上有位宅男数学很厉害,各种被女生‘围观’,这数学为 ...

  3. NLP(十) 主题识别

    主题识别 是发现输入文本集合中存在的主题的过程 LDA算法,即狄利克雷分布算法 from nltk.tokenize import RegexpTokenizer from nltk.corpus i ...

  4. 手把手教你用深度学习做物体检测(七):YOLOv3介绍

    YOLOv3 论文:< YOLOv3: An Incremental Improvement > 地址: https://arxiv.org/pdf/1804.02767.pdfyolov ...

  5. 2019DX#5

    Solved Pro.ID Title Ratio(Accepted / Submitted)   1001 fraction 辗转相除 4.17%(7/168) ok  1002 three arr ...

  6. HDU-2795Billboard+对宽度建立线段树

    参考:  https://blog.csdn.net/qiqi_skystar/article/details/49073309 传送门:http://acm.hdu.edu.cn/showprobl ...

  7. 51nod 1060 最复杂的数(数论,反素数)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1060 题解:可以去学习一下反素数. #include < ...

  8. 卸载VMware

    最近使用ubuntu的时候操作不当直接卡死了,然后强制关闭VMware软件,之后再打开时出现本文中的 “Vmware启动ubuntu 出现错误 ”这个情况,具体请看链接:https://www.cnb ...

  9. 网络基础 ----------- 电脑作为wifi站点

    在上大学的时候最难受的就是,没有无线,但是电脑有宽带,那么怎么将电脑变成路由器哪 1.首先查看你的无线网卡是否支持开无线 通过命令win + R 快捷件进入命令窗口输入 : . netsh wlan ...

  10. 误删除系列一:linux的bin目录误删除后恢复操作

    感言:一失足成千古恨,一不小心就把/usr/bin下所有的命令都删除了,当你以为自己很熟练时,当你以为自己操作对时,可能就是失手的时候,还好这次只是一个测试环境....God 恢复过程:(以下是在vs ...