ViewModel 和 ViewModelProvider.Factory:ViewModel 的建立者

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

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


如今开始

因此,咱们首要问题是:什么是 ViewModelProvider.Factory ?让咱们在不使用 ViewModelProvider.Factory 的状况下,试着建立一个 ViewModel 看看:函数

MyViewModel.kt

在活动中实例化:测试

MyActivity.kt

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

那么,如今让咱们看看,若是咱们直接把参数传递给 MyViewModel 类的构造方法时会发生了什么:3d

MyViewModel.kt

如今,咱们在活动中建立 MyViewModel 实例:对象

MyActivity.kt

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

可是,等等。接口

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

如今咱们为何会发生这些。ViewModelProviders 的 of() 方法,在内部建立了默认的 ViewModelProvider.Factory ,从而实现了 ViewModel 的无参建立。因此,当咱们在构造方法添加参数时, ViewModelProvider.Factory 的内部没法实例化 ViewModel 对象,由于 ViewModelProvider.Factory 调用主构造方法建立 ViewModel’s 实例而失败。下图是 ViewModelFactory ViewModelFactory 的默认实现。

ViewModel Factory inner implementation
若是你想在构造方法中添加参数,你须要编写本身的 ViewModelProvider 来建立 ViewModel 实例。

什么是 ViewModelProvider.Factory?

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

让咱们像下面这样建立本身的 ViewModelProvider.Factory :

MyViewModelFactory.kt

这里有几点须要记下:

  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 实例。

MyActivity.kt

咱们将参数或者依赖关系转入咱们的 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 实例中去

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

相关文章
相关标签/搜索