2.1首先看一下 UserViewModel这个文件
//UserViewModel.kt
//自定义 User 数据类
data class User(var userId: String = UUID.randomUUID().toString(), var userName: String)
class UserViewModel : ViewModel() {
private val userBean = User(userName = “刀锋之影”)
// 私有的 user LiveData
private val _user = MutableLiveData().apply {
value = userBean
}
// 对外暴露的,不可更改 value 值的LiveData
var userLiveData: LiveData = _user
//更新 User 信息
fun updateUser() {
//重新给 _user 赋值
_user.value = userBean.apply {
userId = UUID.randomUUID().toString()
userName = “更新后: userName = 泰隆”
}
}
}
- 自定义 User 数据类
- 继承ViewModel,初始化 User
- 声明私有的 user LIveData 用来更新数据
- 对外暴露的,不可更改 value 值的LiveData
- updateUser() 更新 User 信息的方法
2.2.再看下ViewModelActivity的内容
class ViewModelActivity : AppCompatActivity() {
//初始化 UserViewModel 通过 ViewModelProvider
private val userViewModel by lazy { ViewModelProvider(this)[UserViewModel::class.java] }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val button = Button(this)
setContentView(button)
//观察 User 数据,并打印
userViewModel.userLiveData.observe(this, Observer { user ->
“User = $user”.log()
})
//点击按钮更新 User 信息
button.setOnClickListener {
userViewModel.updateUser()
}
}
}
- 初始化 UserViewModel
- 观察 User 数据,并打印结果
- 点击按钮时,更新 User 信息
2.3.结果日志
//log 日志
User = User(userId=34c1a1a4-967e-439c-91e8-795b8c162997, userName=刀锋之影)
User = User(userId=a6d0f09c-9c01-412a-ab4f-44bef700d298, userName=更新后: userName = 泰隆)
2.4总结:
以上就是 ViewModel 的简单使用,是配合 LiveData 的,具体 LiveData 的使用以及与原理分析,请看这篇文章
Android Jetpack组件LiveData基本使用和原理分析
通过上文可以 ViewModel 的定义以及特点,可以知道 ViewModel在对应的作用域内,保正只生产出对应的唯一实例,保证UI组件间的通信
我们来验证一下这个特点,我再写个例子,证明一下这个特点
3.验证ViewModel在对应的作用域内,保正只生产出对应的唯一实例
3.1.ViewModelActivity2类
在ViewModelActivity2中通过supportFragmentManager添加两个 Fragment
class ViewModelActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_model)
supportFragmentManager.beginTransaction()
.add(R.id.flContainer, FirstFragment())
.add(R.id.flContainer, SecondFragment())
.commit()
}
}
3.2.两个 Fragment
class FirstFragment : Fragment() {
private val TAG = javaClass.simpleName
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val userViewModel = ViewModelProvider(activity as ViewModelStoreOwner)[UserViewModel::class.java]
“userViewModel = $userViewModel”.logWithTag(TAG)
return super.onCr