朋友们好,今天我向你们介绍下 ViewModel 中如何使用 ViewModelProvider.Factory.java
本文翻译自:medium.com/koderlabs/v…ide
因此,咱们首要问题是:什么是 ViewModelProvider.Factory ?让咱们在不使用 ViewModelProvider.Factory 的状况下,试着建立一个 ViewModel 看看:函数
在活动中实例化:测试
有没有人注意到:当咱们使用 ViewModelProviders 在活动中实例化 MyViewModel 时,从未没用过 MyViewModel 的构造方法,而都是使用 ViewModelProviders 这个类中的方法。ViewModelProviders 在内部为咱们管理并调用 ViewModel 的主构造函数,建立viewmodel的实例并将该实例并返回。翻译
那么,如今让咱们看看,若是咱们直接把参数传递给 MyViewModel 类的构造方法时会发生了什么:3d
如今,咱们在活动中建立 MyViewModel 实例:cdn
太棒了!没有发生任何错误对象
可是,等等。blog
当你运行上面这段代码的时候,你收到了 RunTimeError。程序崩溃了!!! RuntimeException 不能建立出 MyViewModel 实例。接口
如今咱们为何会发生这些。ViewModelProviders 的 of() 方法,在内部建立了默认的 ViewModelProvider.Factory ,从而实现了 ViewModel 的无参建立。因此,当咱们在构造方法添加参数时, ViewModelProvider.Factory 的内部没法实例化 ViewModel 对象,由于 ViewModelProvider.Factory 调用主构造方法建立 ViewModel’s 实例而失败。下图是 ViewModelFactory ViewModelFactory 的默认实现。
ViewModelProviders.Factory 接口是负责实例化 ViewModels 对象的启动装置。这意味着你须要本身写实例化 ViewModel 对象的方法。
让咱们像下面这样建立本身的 ViewModelProvider.Factory :
这里有几点须要记下:
如今就让咱们经过 ViewModelProvider.Factory 在活动中建立 ViewModel 实例。
咱们将参数或者依赖关系转入咱们的 ViewModelProvider.Factory 以便于它可以为咱们建立 ViewModel,ViewModelProviders.of( context, instanceOfViewModelFactory) 方法得到咱们 ViewModelProvider.Factory 实例,如今就像以前的例子中同样,咱们已经学会了建立 ViewModel 实例的过程。
咱们心中有这样一些疑问,咱们不能直接在活动或碎片中将值传入 ViewModel 构造方法中去,我须要写法来设置咱们的参数值使其正常工做,这就是为何咱们须要 ViewModelProver.Factory,在一些状况下你能够不使用,但在某些特定情形下,你须要使用 ViewModelProver.Factory。
当你的 ViewModel 有依赖项,而且你须要将这些依赖项经过构造方法传入,所以,您能够模拟该依赖项并测试 ViewModel。
若是你的 ViewModel 没有依赖项,这时你就不须要去本身建立 ViewModelProvider.Factory。系统自带的方法,注意帮助你建立 ViewModel。
ViewModelProvider.Factory 负责帮你建立 ViewModel 实例。当你的 ViewModel 存在依赖项,且你但愿测试你的 ViewModel 时,你须要建立本身的 ViewModelProvider.Factory 来经过 ViewModel 的构造方法传递依赖项,将你的数值传入 ViewModelProvider.Factory 实例中去
你的关注是我最大的动力!