ViewModel的使用
2021-07-23 本文已影响0人
会写代码的小猿猴
前言
作为一个android开发的人,听的最多的就是MVX设计模式,比如MVC啊,还有以前比较火的MVP,但是现在最流行的应该就是MVVM了,MVVM拆解开就是:M--model类,V--view,VM--ViewModel,下面就来看看ViewModel的使用,这其实也是MVVM的设计思想。
使用中需要结合LiveData,如果对LiveData不熟悉的朋友,可以看看我的上一篇博客:
LiveData详解
1、添加依赖
ViewModel是LifeCycle的一个组件库,所以只需要添加LifeCycle库的依赖即可
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
2、创建一个model数据类,并定义需要的数据
class UserData(name: String, phone: Long) {
var name1 = name
var phone1 = phone
}
3、创建ViewModel类
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class UserViewModel : ViewModel() {
val mUserLiveData: MutableLiveData<UserData> = MutableLiveData<UserData>()
//模拟 进行一些数据骚操作
fun doSomething() {
val user: UserData? = mUserLiveData.getValue()
if (user != null) {
user.name1="张志平"
user.phone1=184682974
mUserLiveData.value=user
}
}
init {
//模拟从网络加载用户信息
mUserLiveData.postValue(UserData("周瑜", 187884674))
}
}
4、在activity中将组件与ViewModel中的数据绑定
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.*
import kotlinx.android.synthetic.main.activity_main.*
import java.text.SimpleDateFormat
class MainActivity : AppCompatActivity() {
@SuppressLint("ResourceType")
/* val livedata=MutableLiveData<UserData>()*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var userModel2=ViewModelProvider(viewModelStore,ViewModelProvider.NewInstanceFactory()).get(UserViewModel::class.java)
/* val userModel1:UserViewModel= ViewModelProviders.of(this).get(UserViewModel::class.java)*/
userModel2.mUserLiveData.observe(this, Observer {
name.text=it.name1
phone.text=it.phone1.toString()
})
update.setOnClickListener {
userModel2.doSomething()
}
}
}
注意这一句代码
userModel2=ViewModelProvider(viewModelStore,ViewModelProvider.NewInstanceFactory()).get(UserViewModel::class.java)
这是一句创建ViewModel对象的代码,谷歌刚刚推出ViewModel的时候的写法不是这样的,旧的写法如下:
val userModel1:UserViewModel= ViewModelProviders.of(this).get(UserViewModel::class.java)
但是现在已经被淘汰了,很多网上的文章都还是这样的写法,其实新的写法更好,它里面的参数ViewModelProvider.NewInstanceFactory()是可以继承ViewModelProvider.Factory()并进行自定义的,更加的灵活。
其实这个简单的demo已经初步体现了MVVM的设计模式,当然还有一个更重要的角色LifeCycle没有出场,我会在下一篇文章详细介绍,就简单的记录一下自己的笔记,不理解的小伙伴可以在下面留言,第一时间会回复。