当前位置: 首页 > news >正文

Android-Kotlin基础(Jetpack①-ViewModel)

为什么需要 ViewModel?

传统开发中,当屏幕旋转时,Activity 会被销毁并重新创建,其中的临时数据(如网络请求结果、用户输入内容)会丢失。
ViewModel 的生命周期与 Activity/Fragment 的配置变化无关,它会在整个界面生命周期内保持存在,直到界面彻底销毁(如用户关闭页面)。

ViewModel 基本用法

1. 添加依赖

在 build.gradle(Module 级别)中添加依赖(确保使用最新版本)

dependencies {// ViewModel + LiveData(通常一起使用)implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"// 如果你用 Kotlin 协程implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2"
}
2. 定义 ViewModel 类

创建一个继承 ViewModel 的类,在其中存放需要保留的数据和业务逻辑:

import androidx.lifecycle.ViewModelclass MyViewModel : ViewModel() {// 示例:存储计数器数据private var count = 0// 获取当前计数fun getCount(): Int = count// 增加计数fun incrementCount() {count++}// 清除计数fun resetCount() {count = 0}// ViewModel 销毁时调用(如页面关闭)override fun onCleared() {super.onCleared()// 释放资源,如取消网络请求、关闭数据库连接等}
}
3. 在 Activity/Fragment 中使用 ViewModel

通过 ViewModelProvider 获取 ViewModel 实例(不要自己 new 实例,否则无法保证生命周期):

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProviderclass MainActivity : AppCompatActivity() {private lateinit var viewModel: MyViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 ViewModel 实例(配置变化时会复用同一个实例)viewModel = ViewModelProvider(this)[MyViewModel::class.java]// 绑定 UI 控件val textView = findViewById<TextView>(R.id.textView)val incrementBtn = findViewById<Button>(R.id.incrementBtn)val resetBtn = findViewById<Button>(R.id.resetBtn)// 初始化显示updateCountText(textView)// 按钮点击事件incrementBtn.setOnClickListener {viewModel.incrementCount()updateCountText(textView)}resetBtn.setOnClickListener {viewModel.resetCount()updateCountText(textView)}}private fun updateCountText(textView: TextView) {textView.text = "当前计数:${viewModel.getCount()}"}
}

http://www.dtcms.com/a/319025.html

相关文章:

  • 【遥感图像入门】近三年遥感图像建筑物细粒度分类技术一览
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • Tiger任务管理系统-10
  • vue打包号的文件如何快速查找文件打包后的位置
  • 聚水潭API数据接口开发手机端网页查询商品仓位库位库存工具,支持扫描识别,预览图片
  • Numpy科学计算与数据分析:Numpy线性代数基础与实践
  • 决策树技术详解:从理论到Python实战
  • RabbitMQ-日常运维命令
  • 华为开源CANN,再次释放“昇腾转向”信号
  • 【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析
  • C语言memmove函数详解:安全高效的内存复制利器
  • ELK基础环境安装准备
  • 飞算JavaAI深度解析:Java开发者的智能革命
  • 构建一个简洁优雅的 PHP 参数验证器 —— php-schema-validator
  • 大疆前端笔试题目详解
  • FPGA开发技能(11)用iperf测试网络性能
  • 【unity知识】unity使用AABB(轴对齐包围盒)和OBB(定向包围盒)优化碰撞检测
  • JavaSE---异常的经典面试题
  • 《C语言》函数练习题--1
  • FreeRTROS3——事件组和定时器
  • QT的拖拽功能
  • Flutter开发 Slider组件(如音量控制)
  • 小程序省市级联组件使用
  • 【课题推荐】卡尔曼滤波,创新性的算法与应用:从非线性适用性、鲁棒抗差、自适应、金融与生物新应用等方面考虑
  • 项目构想|文生图小程序
  • idea开发工具中git如何忽略编译文件build、gradle的文件?
  • C5.1:共发射极组态
  • 【Day 18】Linux-DNS解析
  • 如何理解“信号集是位掩码,每个bit代表一个信号”这句话?
  • 怎么在本地引入字体