概述
LiveData是一种可观察的数据存储器类,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。通过给LiveData设置观察者,当LiveData所包裹的数据发生变化时,相应的观察者就会收到该数据的变化,进而就可以通过最新的数据进行相应的处理。另外,LiveData 只会将更新通知给活跃的观察者。为观察 LiveData对象而注册的非活跃观察者不会收到更改通知。如果观察者(由Observer 类表示)的生命周期处于Started 或Resumed 状态,则 LiveData 会认为该观察者处于活跃状态。
优势:
基本使用
创建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
}
}
观察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界面。
Compose中实时观察数据(State)的使用方法
创建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
}
}
在Compose函数中设置观察者,观察LiveData的数据变化
val nameState by helloViewModel.name.observeAsState("zyt") // 设置初始值 “zyt"
// 当然也可以不设置初始值,建议设置初始值,因为不设置初始值后面需要进行空校验
// 因为下面的语句,当HelloViewModel中的_name没有设置初始值空字符串,那么有可能就会报错,
// 当然这个编辑器会进行提示的
// observeAsState() 的返回类型为 State<T?>,可以理解为通过属性委派获得value有可能为空,
val name: String? by helloViewModel.name.observeAsState()
在上面的图中,当通过observeAsState()方法给LiveData设置观察者时,该方法会通过State对象来代表它的新值,然后当数据State发生变化时,在Compose中使用到State的地方就会发生重组。
原文:https://www.cnblogs.com/sowhappy/p/15252683.html