三、ViewModel
1. 作用
? 用來存儲和管理UI相關(guān)數(shù)據(jù)的類
? 系統(tǒng)配置發(fā)生改變時,能對 LiveData 進行正確的保存和恢復
2. 使用
2.1. 創(chuàng)建 ViewModel
? 使用 ViewModel + LiveData 創(chuàng)建
? 創(chuàng)建 ViewModel 返回 LiveData 數(shù)據(jù)
// 創(chuàng)建 ViewModel
class MyViewModel : ViewModel() {
// 定義屬性
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData<List<User>>().also { loadUsers() }
}
// 獲取 數(shù)據(jù)
fun getUsers(): LiveData<List<User>> {
return users
}
// 修改數(shù)據(jù)請使用 setter 方法
private fun loadUsers() {
// 異步獲取數(shù)據(jù),如 DB 加載數(shù)據(jù)
}
}
2.2. 獲取/使用 ViewModel
? 系統(tǒng)配置發(fā)生改變重建時已經(jīng)進行了緩存
-
導包
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被銷毀的時,執(zhí)行它的onCleared( )進行數(shù)據(jù)清理
[站外圖片上傳中...(image-49be8b-1599023821919)]
4. Fragment 間數(shù)據(jù)共享
? 推薦使用 Room(數(shù)據(jù)庫)+ 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日