Kotlin ViewModel
Kotlin ViewModel 全流程指南ViewModel 的核心作用是以注重生命周期的方式存储和管理界面相关的数据。它最伟大的地方在于当手机屏幕旋转配置更改导致 Activity 重建时ViewModel 中的数据不会丢失。大纲添加依赖创建 ViewModel 类在-activity-或-fragment-中初始化ViewModel 的生命周期核心准则 Best Practices总结1. 添加依赖在build.gradle.kts (Module: app)中添加 Lifecycle 库dependencies{vallifecycle_version2.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_counterMutableStateFlow(0)valcounter:StateFlowInt_counterfunincrementCounter(){_counter.value1}}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){privatevalprefsapplication.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单向数据流轻量化