Android开发中用Kotlin编写LiveData组件教程
Hdnw 人气:0LiveData是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 } }
加载全部内容