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 的类,在其中存放需要保留的数据和业务逻辑:

Kotlin 复制代码
import androidx.lifecycle.ViewModel

class 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 实例,否则无法保证生命周期):

Kotlin 复制代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel
    
    override 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()}"
    }
}
相关推荐
叽哥23 分钟前
flutter学习第 5 节:文本与样式
android·flutter·ios
鹏多多.1 小时前
flutter-使用AnimatedDefaultTextStyle实现文本动画
android·前端·css·flutter·ios·html5·web
似霰2 小时前
安卓系统属性之androidboot.xxx转换成ro.boot.xxx
android·gitee
用户2018792831673 小时前
限定参数范围的注解之 "咖啡店定价" 的故事
android·java
xzkyd outpaper4 小时前
Android中视图测量、布局、绘制过程
android
泓博4 小时前
Android底部导航栏图标变黑色
android
包达叔4 小时前
使用 Tauri 开发 Android 应用:环境搭建与入门指南
android
初学者-Study4 小时前
Android UI(一)登录注册
android·ui
视觉CG4 小时前
【JS】扁平树数据转为树结构
android·java·javascript