Jetpack(三)ViewModel

三、ViewModel

1. 作用

• 用来存储和管理UI相关数据的类
• 系统配置发生改变时,能对 LiveData 进行正确的保存和恢复

2. 使用
2.1. 创建 ViewModel

• 使用 ViewModel + LiveData 创建
• 创建 ViewModel 返回 LiveData 数据

// 创建 ViewModel
class MyViewModel : ViewModel() {
    
    // 定义属性
    private val users: MutableLiveData> by lazy {
        MutableLiveData>().also { loadUsers() }
    }

    // 获取 数据
    fun getUsers(): LiveData> {
        return users
    }
    
    // 修改数据请使用 setter 方法
    
    private fun loadUsers() {
        // 异步获取数据,如 DB 加载数据
    }
}
2.2. 获取/使用 ViewModel

• 系统配置发生改变重建时已经进行了缓存

  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> { 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被销毁的时,执行它的onCleared( )进行数据清理

[站外图片上传中...(image-49be8b-1599023821919)]

4. Fragment 间数据共享

• 推荐使用 Room(数据库)+ ViewModel 能直接返回 LiveData

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData()

    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 { item ->
            // Update the UI
        })
    }
}

Demo地址 : ViewModel[module]


2020年9月2日

你可能感兴趣的:(Jetpack(三)ViewModel)