持续创作,加快成长!这是我参加「日新方案 10 月更文挑战」的第21天,点击检查活动详情,希望大家多多支撑,帮忙点个赞,谢谢!

前言

第一篇咱们将Transformations的map()办法拿来救场,为咱们的User类保护了用户隐私。这篇咱们就来看看switchMap(),这个办法运用场景十分固定,但或许比map()办法愈加常用。

正篇

首要,让咱们看看LiveData不在ViewModel中创立的情形,咱们新建一个Repository单例类:

object Repository {
    fun getUser(userId : String) : LiveData<User> {
        val liveData = MutableLiveData<User>()
        liveData .value = User(userId, userId, 0)
        return liveData
    }
}

咱们在此类中写了一个getUser()办法,该办法能够承受一个userId参数,每次将传入的userId当作用户姓名去创立一个新的User目标,而且需要注意的是,getUser()办法回来的是一个包含User数据的LiveData目标,且其每次调用都会获取LiveData目标。

接着咱们在ViewModel中也定义一个getUser()办法,然后用它去调用Repository的getUser()办法从而获取LiveData目标,至此,咱们构建了一个不在ViewModel中创立LiveData的情形,假如按之前的写法来:

class MainViewModel(countReserved: Int) : ViewModel() {
         ...
     fun getUser(userId : String) : LiveData<User> {
         return Repository.getUser(userId)
      }
}

MainActivity中:

viewModel.getUser(userId).observe(this) { user ->
}

上面的写法显然是行不通的,由于每次调用getUser办法都回来了新的LiveData实例,而MainActivity中调查的都是旧的实例,所以无法正确观测的数据变化,所以导致这种情况下LiveData无法调查。

所以,为了应对这种情况,咱们就能够运用switchMap()办法,它的运用场景正是在假如ViewModel中的某个LiveData目标不是自己创立的而是调用其他办法获取的,那咱们就能够用该办法去将LiveData目标转化成另一个可调查的LiveData目标:

class MainViewModel(countReserved: Int) : ViewModel() {
    ...
    private val userIdLiveData = MutableLiveData<String>()
    val user: LiveData<User> = Transformations.switchMap(userIdLiveData) { userId ->
        Repository.getUser(userId)
    }
    fun getUser(userId : String) {
        userIdLiveData.value = userId
    }
}

与map()办法相似,不过第二个参数不同,咱们有必要在这个转化函数中回来一个LiveData目标,由于switchMap()办法的工作原理行将转化函数中回来的LiveData目标转化成另一个可调查的LiveData目标。
接下来再将xml布局与MainActivity对应调整:
activity.xml再加一个按钮

<Button
    android:id="@+id/getUserBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Get User"/>

MainActivity中添加按钮的事情与对应LiveData调查:

val getUserBtn : Button = findViewById(R.id.getUserBtn)
getUserBtn.setOnClickListener {
    val userId = (0..10000).random().toString()
    viewModel.getUser(userId)
}
viewModel.user.observe(this, Observer { user ->
    infoText.text = user.firstName
})

最后运转一下,咱们一直点击“Get User”按钮,能够看到数据在随机变化,如下:

结语

到目前为止,咱们现已把关于Jetpack组件LiveData中的相关部分说的差不多了,后边还有Room等,等候有时间后会持续更新。