gpt4 book ai didi

Android创建viewModel对象的不同方法何时使用哪一种?

转载 作者:行者123 更新时间:2023-12-05 00:14:39 25 4
gpt4 key购买 nike

我最近开始使用 ViewModel 和 AndroidViewModel,我看到初始化 viewModel 实例有不同的方法,对我来说一切正常,我只想知道什么时候使用哪个?我应该在哪里初始化 viewModel 对象?以下都是获取 viewModel 实例并为我工作的不同方法:

    val myViewModel1 = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)
val myViewModel2 = ViewModelProvider.AndroidViewModelFactory(this.application).create(MyViewModel::class.java)
val myViewModel3 = ViewModelProvider(this).get(MyViewModel::class.java)
val myViewModel4: MyViewModel by viewModels()
val myViewModel5 by viewModels<MyViewModel>()
对我来说最简单和最简单的是第 3、第 4 和第 5,但是我不知道所有五种方法有什么区别,也请告诉我是否有其他方法或最佳方法来初始化我的 viewModel 对象,我在声明全局变量时对其进行初始化,是否可以在声明时进行初始化,或者应该在某个生命周期方法中完成?

最佳答案

如果有人在寻找深入的答案,请检查这个,这里我们有以下方法来创建或获取 viewModel 对象:

  • val myViewModel1 = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)
  • myViewModel2 = ViewModelProvider.AndroidViewModelFactory(this.application).create(MyViewModel::class.java)
  • val myViewModel3 = ViewModelProvider(this).get(MyViewModel::class.java)
  • val myViewModel4: MyViewModel by viewModels()
  • val myViewModel5 by viewModels<MyViewModel>()

  • 所有人都做同样的事情,唯一的两个关键区别是:
  • 使用延迟加载和没有延迟加载的 viewModel 初始化。
  • 多参数无参数的viewModel。

  • 让我们看看 lazy loading and without lazy loading ,前三个没有委托(delegate) by这意味着该对象没有延迟加载,因此它是开发人员
    只有在创建 Activity 或将 fragment 附加到 Activity 时才负责创建 viewModel 对象,这意味着前三种方法(1、2、3)不能
    在全局范围内使用,如果在全局范围内使用,变量必须是
    一个带有 lateint 的变量或空初始化,以及
    初始化(方法 1、2、3)必须在 onCreate 或
    onViewCreated(在 fragment 的情况下)。
    因此创建 viewModel 对象的最佳方式是使用委托(delegate) by (4, 5),两者相同,语法略有不同,我选择 4 是因为它简单易读。
    val myViewModel4: MyViewModel by viewModels()
    by委托(delegate)提供了延迟加载实例的灵 active ,您可以在全局范围内定义 View 模型并摆脱样板代码,如果您尝试在没有委托(delegate)的情况下在全局范围内初始化 View 模型,应用程序将崩溃,因为 View 模型将尝试初始化在创建 Activity 之前(它不会延迟加载 viewModel 实例)。
    现在让我们看看如何使用多个参数进行延迟加载, 6th问题中未提及的方法。
    如果你的 View 模型中有多个参数并且没有使用任何依赖注入(inject),你可以使用 ViewModelFactory 实现然后延迟加载它:
    val myViewModelWithParm: MyViewModel by viewModels { MyViewModelFactory(application, "param1", "param2") }
    ViewModelFactory 实现:
        class MyViewModelFactory(val application: Application, val param1: String, val param2: String) :
    ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return MyViewModel(application, param1, param2) as T
    }
    }
    到目前为止,我们已经清楚了委托(delegate)初始化 (4, 5),以及它与 (1, 2, 3) 的不同之处现在让我们看看前 3 种方法 (1, 2, 3) 的区别。
    让我们首先检查 1 和 2。
  • val myViewModel1 = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)
  • myViewModel2 = ViewModelProvider.AndroidViewModelFactory(this.application).create(MyViewModel::class.java)

  • 它们的主要区别在于一个用途 ViewModelProvider.NewInstanceFactory和其他用途 ViewModelProvider.AndroidViewModelFactory ,所以我检查了这两个类的源代码,发现 ViewModelProvider.AndroidViewModelFactory实际上是 ViewModelProvider.NewInstanceFactory的实现覆盖 create这意味着两者都在做同样的事情,如果我们想要多个参数,最好选择两种方法,但是为此我们必须覆盖 ViewModelProvider.NewInstanceFactory像它一样创建我们自己的工厂 here
    现在是第三个: val myViewModel3 = ViewModelProvider(this).get(MyViewModel::class.java)当我们的 ViewModel 中没有多个参数并且不想延迟加载对象时,这是 1 和 2 的简单形式。
    注:我强烈推荐方法 4 或 5(两者相同但语法不同),因为这是最适合和最佳编写的方法,如果您没有多个参数,如果您有多个参数,您可以使用提到的方法 6在答案中通过实现 ViewModelProvider.Factory .

    关于Android创建viewModel对象的不同方法何时使用哪一种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70633472/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com