Activity中使用“viewModels()与“ViewModelProvider(this).get(ViewModel::class.java)初始化ViewModel的区别?
创始人
2024-07-25 07:01:07
0

在 Activity 中初始化 ViewModel,可以通过以下两种方法:

一、使用“viewModels()”方法:

在 Activity 中使用以下代码初始化 ViewModel:

class MainActivity : AppCompatActivity() {
    
    private val viewModel by viewModels()

    // 其他代码...
}

优点:

1、使用便捷:使用简单,省去了手动创建 ViewModelProvider 的步骤,代码更简洁。

2、生命周期感知:使用“viewModels()”方法创建出来的 ViewModel 可以感知到 Activity 的生命周期变化,不需要手动处理 ViewModel 的生命周期。

缺点:

1、无法自定义 ViewModelProvider:使用“viewModels()”方法可以自动创建 ViewModelProvider,但是无法自定义创建方式。如果需要自定义 ViewModelProvider,就需要使用第二种方法。

二、使用“ViewModelProvider(this).get(ViewModel::class.java)”方法:

在 Activity 中使用以下代码初始化 ViewModel:

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: ViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        viewModel = ViewModelProvider(this).get(ViewModel::class.java)

        // 其他代码...
    }
}

优点:

1、自定义 ViewModelProvider:使用“ViewModelProvider(this).get(ViewModel::class.java)”方法可以自定义 ViewModelProvider 的创建方式,可以传入自定义的 Factory。

2、可读性强:使用“ViewModelProvider(this).get(ViewModel::class.java)”方法代码更加清晰易懂,可以看出是通过 ViewModelProvider 获取 ViewModel。

缺点:

1、需要手动处理 ViewModel 生命周期。

注:以上两种初始化 ViewModel 的方式本质上是一样的,只是处理方式略有不同,选择哪种方式取决于个人习惯和需要。

相关内容

热门资讯

Android Studio ... 要解决Android Studio 4无法检测到Java代码,无法打开SDK管理器和设置的问题,可以...
安装tensorflow mo... 要安装tensorflow models object-detection软件包和pandas的每个...
安装了Laravelbackp... 检查是否创建了以下自定义文件并进行正确的配置config/backpack/base.phpconf...
安装了centos后会占用多少... 安装了CentOS后会占用多少内存取决于多个因素,例如安装的软件包、系统配置和运行的服务等。通常情况...
按照Laravel方式通过Pr... 在Laravel中,我们可以通过定义关系和使用查询构建器来选择模型。首先,我们需要定义Profile...
按照分类ID显示Django子... 在Django中,可以使用filter函数根据分类ID来筛选子类别。以下是一个示例代码:首先,假设你...
Android Studio ... 要给出包含代码示例的解决方法,我们可以使用Markdown语法来展示代码。下面是一个示例解决方案,其...
Android Retrofi... 问题描述:在使用Android Retrofit进行GET调用时,获取的响应为空,即使服务器返回了正...
Alexa技能在返回响应后出现... 在开发Alexa技能时,如果在返回响应后出现问题,可以按照以下步骤进行排查和解决。检查代码中的错误处...
Airflow Dag文件夹 ... 要忽略Airflow中的笔记本检查点,可以在DAG文件夹中使用以下代码示例:from airflow...