Jetpack--->LiveData知识点梳理

Jetpack--->LiveData知识点梳理

  1. 概述

    LiveData是一种可观察的数据存储器类,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。通过给LiveData设置观察者,当LiveData所包裹的数据发生变化时,相应的观察者就会收到该数据的变化,进而就可以通过最新的数据进行相应的处理。另外,LiveData 只会将更新通知给活跃的观察者。为观察 LiveData对象而注册的非活跃观察者不会收到更改通知。如果观察者(由Observer 类表示)的生命周期处于Started 或Resumed 状态,则 LiveData 会认为该观察者处于活跃状态。

    优势:

    1. 不会发生内存泄漏
      观察者会绑定到Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理。
    2. 不需要手动处理生命周期
    3. 数据始终保持最新状态
      ? 如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
  2. 基本使用

    1. 创建ViewModel

      class NameViewModel : ViewModel() {
      
          // Create a LiveData with a String
          val currentName: MutableLiveData<String> by lazy {
              MutableLiveData<String>("zyt")
          }
          
          // 更新LiveData的时事件
          fun changeName(newName: String){
              currentName.value = newName
          }
          
      }
      
    2. 观察LiveData

      class NameActivity : AppCompatActivity() {
      	// 使用属性委派初始化ViewModel
          private val model: NameViewModel by viewModels()
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              // 创建Observer
              val nameObserver = Observer<String> { newName ->
                  // 更新UI
                  nameTextView.text = newName
              }
              // 给LiveData设置观察者
              model.currentName.observe(this, nameObserver)
          }
          
      }
      

      当我们在NameActivity中触发ViewModel中的changeName事件时,那麽观察者就会收到通知,通过onChange回调携带最新的value,进而实时更新UI界面。

  3. Compose中实时观察数据(State)的使用方法

    1. 创建ViewModel

      class HelloViewModel : ViewModel() {
      
          // LiveData holds state which is observed by the UI
          // (state flows down from ViewModel)
          private val _name = MutableLiveData("") // 初始值 空字符串
          val name: LiveData<String> = _name
      
          // onNameChanged is an event we‘re defining that the UI can invoke
          // (events flow up from UI)
          fun onNameChanged(newName: String) {
              _name.value = newName
          }
      }
      
    2. 在Compose函数中设置观察者,观察LiveData的数据变化

      val nameState by helloViewModel.name.observeAsState("zyt") // 设置初始值 “zyt"
      // 当然也可以不设置初始值,建议设置初始值,因为不设置初始值后面需要进行空校验
      // 因为下面的语句,当HelloViewModel中的_name没有设置初始值空字符串,那么有可能就会报错,
      // 当然这个编辑器会进行提示的
      // observeAsState() 的返回类型为 State<T?>,可以理解为通过属性委派获得value有可能为空,
      val name: String? by helloViewModel.name.observeAsState()
      

      Jetpack--->LiveData知识点梳理

      在上面的图中,当通过observeAsState()方法给LiveData设置观察者时,该方法会通过State对象来代表它的新值,然后当数据State发生变化时,在Compose中使用到State的地方就会发生重组。

Jetpack--->LiveData知识点梳理

上一篇:C++ 中权限问题的思考


下一篇:微信小程序 实现客服功能 和 ICON标签