朋友们好,今天我向大家介绍下 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 实例。
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 实例中去
你的关注是我最大的动力!