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()}"}
}