ViewModel基本用法
创建viewmodel
kotlin
class MyViewModel: ViewModel() {
}
实现一个计数器
kotlin
class MyViewModel : ViewModel() {
var count = 0
}
在activity使用ViewModel,获取ViewModel的实例需要通过ViewModelProvider。点击按钮一次计数器加1
kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityClickBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
binding.clickButC.setOnClickListener {
viewModel.count++
refreshCount()
}
refreshCount()
}
private fun refreshCount() {
binding.clickTvText.text = viewModel.count.toString()
}

旋转屏幕后,计数器的数据仍然存在
向ViewModel传递参数
改进上面的例子,保证退出程序后,重新打开,数据任然存在。
修改viewmodel
kotlin
class MyViewModel(counter: Int) : ViewModel() {
var count = counter
}
counter记录之前保存的值
创建ViewModelProvider.Factory ,向MyViewModel的构造函数传递数据。添加构造函数,重写create方法,
kotlin
class MyViewModelFactory(private val counter: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MyViewModel(counter) as T
}
}
修改activity
kotlin
class ClickActivity : ComponentActivity() {
lateinit var viewModel: MyViewModel
lateinit var binding:ActivityClickBinding
lateinit var sp: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityClickBinding.inflate(layoutInflater)
setContentView(binding.root)
sp = getSharedPreferences("data",MODE_PRIVATE)
val countSp = sp.getInt("count",0)
viewModel = ViewModelProvider(this, MyViewModelFactory(countSp)).get(MyViewModel::class.java)
binding.clickButC.setOnClickListener {
viewModel.count++
refreshCount()
}
refreshCount()
}
private fun refreshCount() {
binding.clickTvText.text = viewModel.count.toString()
}
override fun onPause() {
super.onPause()
sp.edit{
putInt("count",viewModel.count)
}
}
}