当前位置: 首页 > 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.lryc.cn/news/612852.html

相关文章:

  • 软件测试中,pytest 运行完成后,如何自动发送邮件?
  • 解密MVCC:如何实现高效的数据库并发
  • Linux学习-数据结构(二叉树)
  • 【物联网】基于树莓派的物联网开发【24】——树莓派安装influxDB时序数据库
  • 关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。
  • 时序数据库的功能与应用价值
  • uniapp-vue2导航栏全局自动下拉变色
  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • imx6ull-驱动开发篇12——GPIO子系统驱动LED
  • Android Studio(2025.1.2)Gemini Agent 使用指南
  • 如何使用 pnpm创建Vue 3 项目
  • Vue内置动画组件 Transition
  • 【FreeRTOS】(号外)任务间通讯2: 信号量- Counting Semaphore
  • 前端发布 发布前端项目流程
  • Spring AI + Redis:构建高效AI应用缓存方案
  • 华为 2025 校招目标院校
  • 杂谈:大模型与垂直场景融合的技术趋势
  • 高通芯片漏洞被在野利用,谷歌发布紧急安卓补丁
  • Swift 实战:高效设计 Tic-Tac-Toe 游戏逻辑(LeetCode 348)
  • ansible-playbook之yum
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • LeetCode 面试经典 150_数组/字符串_除自身以外数组的乘积(13_238_C++_中等)(前缀积)
  • 数据结构初阶(5)队列
  • java - 深拷贝 浅拷贝
  • KT148A 语音芯片自研板烧录方案:接口预留与电路连接指南
  • 线上业务突然流量掉 0 ?一次 DNS 污染排查与自救实录
  • itextPdf获取pdf文件宽高不准确
  • 无人机航拍数据集|第8期 无人机海上目标检测YOLO数据集3641张yolov11/yolov8/yolov5可训练
  • BES2700量产项目
  • 7. 什么是事件委托