LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。也就是说,我们可以将数据使用LiveData来包装,然后在Activity中去观察它,就可以主动将数据变化通知给Activity了。
1.简单使用
class MainViewModel(countReserved:Int) : ViewModel() {
/*当外部调用counter变量时,实际上获得的就是_counter的实例,但是无法给counter设置数据,从而保证了ViewModel的数据的封装性。*/
val counter:LiveData<Int>
get()=_counter
private val _counter = MutableLiveData<Int>()
init{
_counter.value=countReserved
}
fun plusOne() {
val count = _counter.value ?: 0
_counter.value = count + 1
}
fun clear() {
_counter.value = 0
}
}
class MainActivity : AppCompatActivity() {
…
override fun onCreate(savedInstanceState: Bundle?) {
…
plusOneBtn.setOnClickListener {
viewModel.plusOne()
}
clearBtn.setOnClickListener {
viewModel.clear()
}
viewModel.counter.observe(this, Observer { count ->
infoText.text = count.toString() // 将最新数据更新到界面上
})
}
}
2.map和switchMap
LiveData为了能够应对各种不同的需求场景,提供了两种转换方法:map()和switchMap()方法。
- map()方法的作用就是将实际包含数据的LiveData和仅用于观察数据的LiveData进行转换。
比如说有一个User类,User中包含用户的姓名和年龄
data class User(var firstName:String,var lastName:String,var age:Int)
map()方法可以将User类型的LiveData自由地转型成任意其他类型地LiveData。
class MainViewModel(countReserved:Int) : ViewModel() {
private val userLiveData = MutableLiveData<User>()
val userName:LiveData<String>=Transformations.map(userLiveData){user->
"${user.firstName} ${user.lastName}"
}
}
- 如果ViewModel中的某个LiveData对象时调用另外的方法获取的,那么我们就可以借助switchMap()方法,将这个LiveData对象转换成另一个可观察的LiveData对象。
新建Repository单例类
object Repository{
fun getUser(userId:String):LiveData<User>{
val liveData=MutableLiveData<User>()
liveData.value=User(userId,userId,0)
return liveData
}
}
class MainViewModel(countReserved:Int) : ViewModel() {
private val userLiveData = MutableLiveData<User>()
val user:LiveData<User>=Transformations.SwitchMap(userIdLiveData){userId->
Repository.getUser(userId)
}
fun getUser(userId:String){
userIdLiveData.value=userId
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95973.html