Jetpack(三)ViewModel

三、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)進行了緩存

  1. 導包

    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"
    }
    
  2. 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
    })
    
  3. 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日

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容