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

Kotlin ViewModel

Kotlin ViewModel 全流程指南

ViewModel 的核心作用是以注重生命周期的方式存储和管理界面相关的数据。它最伟大的地方在于:当手机屏幕旋转(配置更改)导致 Activity 重建时,ViewModel 中的数据不会丢失。


大纲

  1. 添加依赖
  2. 创建 ViewModel 类
  3. 在-activity-或-fragment-中初始化
  4. ViewModel 的生命周期
  5. 核心准则 Best Practices
  6. 总结

1. 添加依赖

build.gradle.kts (Module: app)中添加 Lifecycle 库:

dependencies{vallifecycle_version="2.8.0"// 请检查最新版本implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version")// 如果在 Activity/Fragment 中使用 'by viewModels()' 扩展implementation("androidx.activity:activity-ktx:1.9.0")}

2. 创建 ViewModel 类

ViewModel 应该存放所有的 UI 数据逻辑。建议配合 StateFlow 或 LiveData 使用,以实现响应式编程。

importandroidx.lifecycle.ViewModelimportkotlinx.coroutines.flow.MutableStateFlowimportkotlinx.coroutines.flow.StateFlowclassMyViewModel:ViewModel(){// 使用 StateFlow 管理状态privateval_counter=MutableStateFlow(0)valcounter:StateFlow<Int>=_counterfunincrementCounter(){_counter.value+=1}}

3. 在 Activity 或 Fragment 中初始化

⚠️ 千万不要直接通过val vm = MyViewModel()来实例化,否则它就失去了生命周期感知的特性。必须通过 ViewModelProvider 或by viewModels()委托。

3.1 在 Activity 中

classMainActivity:AppCompatActivity(){// 使用 ktx 扩展函数(推荐)privatevalviewModel:MyViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 观察数据变化(以 Flow 为例)lifecycleScope.launch{repeatOnLifecycle(Lifecycle.State.STARTED){viewModel.counter.collect{count->// 更新 UI,例如:textView.text = count.toString()}}}}}

3.2 在 Fragment 中(共享 ViewModel)

如果你希望 Fragment 之间共享数据,可以使用activityViewModels()

classMyFragment:Fragment(){// 与宿主 Activity 共享同一个 ViewModel 实例privatevalsharedViewModel:MyViewModelbyactivityViewModels()}

4. ViewModel 的生命周期

理解 ViewModel 的生命周期至关重要。它的存活时间比具体的 Activity 实例更长。

阶段说明
创建当 Activity 第一次启动时
存活当 Activity 因为旋转屏幕而销毁并重新创建时,ViewModel 依然存在
销毁只有当 Activity 真正彻底结束(调用finish())或进程被杀掉时,ViewModel 才会调用onCleared()并销毁

5. 核心准则 (Best Practices)

5.1 禁止持有 Context

⚠️ 绝对不要在 ViewModel 中引用 Activity、Fragment 或 View(会导致内存泄漏)。

如果需要 Context,请继承AndroidViewModel(application)

classMyAndroidViewModel(application:Application):AndroidViewModel(application){privatevalprefs=application.getSharedPreferences("my_prefs",Context.MODE_PRIVATE)funsaveData(key:String,value:String){prefs.edit().putString(key,value).apply()}}

5.2 单向数据流

UI 观察 ViewModel 的状态 → UI 的操作调用 ViewModel 的方法 ↓ 不要在 UI 中直接修改 ViewModel 的变量

5.3 轻量化

  • ViewModel只负责逻辑和数据
  • ViewModel不负责处理复杂的 UI 动画或具体的框架调用

总结

你是正在做传统的 XML 布局开发,还是已经在使用 Jetpack Compose 了?(Compose 中 ViewModel 的注入方式略有不同)。

关键点说明
依赖添加lifecycle-viewmodel-ktx + activity-ktx
实例化方式by viewModels()ViewModelProvider,禁止new MyViewModel()
数据管理配合 StateFlow / LiveData 实现响应式
生命周期跨配置变化存活,真正 finish 时销毁
最佳实践不持有 Context,单向数据流,轻量化
http://www.jsqmd.com/news/797305/

相关文章:

  • 智能体与世界模型“同源同宗”:当智能体足够强,世界模型就出来了
  • Vivado 2023.1 与 Questasim 2024.1 协同仿真环境搭建全攻略
  • League-Toolkit:基于LCU API的英雄联盟客户端自动化工具深度解析
  • 2025届毕业生推荐的十大AI辅助论文助手实际效果
  • D3KeyHelper暗黑3鼠标宏工具:从零开始掌握自动化战斗的终极指南
  • 必知必会:大模型位置编码RoPE与ALiBi位置编码详解
  • Android 11(R) MTK平台新分区实战:从分区表到SELinux的完整配置
  • 2025届必备的五大降AI率平台实测分析
  • 3大核心技术解密:LeagueAkari本地自动化工具架构设计与实战指南
  • sndcpy音频转发工具:Android设备音频镜像的完整指南
  • 终极风扇控制神器:FanControl 让你的电脑静音又凉爽
  • Obsidian官方同步插件 Nutstore Sync:冲突与增量同步指南
  • 【RHCA+】安装RHEL7操作系统
  • 实战指南:从零开始掌握Visual C++运行库一键修复的高效用法
  • ESP32-CAM图像显示进阶:对比RGB565直出与JPEG解码,哪种更适合你的ST7789屏幕?
  • 如何快速上手WeixinBot:微信机器人的终极使用指南
  • HTML入门笔记
  • ColorControl:Windows HDR模式下SDR内容显示异常的终极解决方案
  • 5步实现Windows游戏手柄完美兼容:ViGEmBus虚拟驱动终极解析
  • Zotero Connector进阶指南:解锁知乎内容完整抓取与Snapshot模式精准切换
  • rpa项目的庖丁解牛
  • 保姆级教程:在STM32F407上搞定FreeRTOS+TCP网络通信(含LAN8720驱动调试)
  • 鸣潮自动化终极指南:如何用ok-ww实现后台自动战斗和智能声骸管理
  • Dell G15散热终极解决方案:开源温度控制中心完全指南
  • Elasticsearch 磁盘水位线详解:从触发只读到安全解锁
  • C++中的右值引用
  • FanControl深度解析:5个步骤让Windows风扇控制从入门到精通
  • 2026广州房产自媒体博主推荐必看! - 速递信息
  • 2026年5月更新:欧米茄腕表常见故障与全国预约服务中心指引 - 博客万
  • Nigate:Mac用户的NTFS读写救星,3分钟解决跨平台文件传输难题