Jetpack(三)ViewModel
2020-09-02 本文已影响0人
Demon鑫
三、ViewModel
1. 作用
• 用来存储和管理UI相关数据的类
• 系统配置发生改变时,能对 LiveData 进行正确的保存和恢复
2. 使用
2.1. 创建 ViewModel
• 使用 ViewModel
+ LiveData
创建
• 创建 ViewModel
返回 LiveData
数据
// 创建 ViewModel
class MyViewModel : ViewModel() {
// 定义属性
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData<List<User>>().also { loadUsers() }
}
// 获取 数据
fun getUsers(): LiveData<List<User>> {
return users
}
// 修改数据请使用 setter 方法
private fun loadUsers() {
// 异步获取数据,如 DB 加载数据
}
}
2.2. 获取/使用 ViewModel
• 系统配置发生改变重建时已经进行了缓存
-
导包
android { ... kotlinOptions { jvmTarget = "1.8" } } dependencies { ... // ======================= activity-ktx ======================= def activity_version = "1.1.0" def fragment_version = "1.2.5" // Kotlin implementation "androidx.activity:activity-ktx:$activity_version" implementation "androidx.fragment:fragment-ktx:$fragment_version" }
-
Activity 使用
// 获取 MyViewModel val model: MyViewModel by viewModels() model.getUsers().observe(this, Observer<List<User>> { users -> // update UI }) // 获取 MyViewModel 简化后 val mModel: MyViewModel by viewModels() // 获取 LiveData 实例 mModel.getUsers().observe(this, { users -> // update UI })
-
Fragment 使用
// 在 Fragment onCreate() 获取 viewModel private val model: MyViewModel by activityViewModels()
3. ViewModel 生命周期
• ViewModel
最终消亡是在Activity
被销毁的时,执行它的onCleared( )
进行数据清理
[站外图片上传中...(image-49be8b-1599023821919)]
4. Fragment 间数据共享
• 推荐使用 Room
(数据库)+ ViewModel
能直接返回 LiveData
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<ClipData.Item>()
fun select(item: ClipData.Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
// 在 Fragment 获取 iewModel
private val model: MyViewModel by activityViewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// itemSelector.setOnClickListener { item ->
// // Update the UI
// }
}
}
class DetailFragment : Fragment() {
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.selected.observe(viewLifecycleOwner, Observer<ClipData.Item> { item ->
// Update the UI
})
}
}
Demo地址 : ViewModel[module]
2020年9月2日