我可以在 switchMap 转换函数中保留 LiveData 的原始值吗?

Can I keep the original value of a LiveData in a switchMap transformation function?

我正在使用带有 LiveData 的 ViewModel。下面的代码是我的 ViewModel 的一部分。每次 searchQuery 更改时,它都使用 switchMap 转换来获取项目列表。

每次 searchQuery 更改时,项目都会从存储库中正确检索,但在存储库返回响应之前,items 实时数据将首先获得 null 更新,当存储库 returns 响应时,它会更新为正确的值。有没有办法可以跳过此 null 更新并保留 items 的原始值,直到存储库实际 returns 结果?

val searchQuery = MutableLiveData<String>()
val items: LiveData<List<String>> = Transformations.switchMap(searchQuery) { query ->
    val liveData = MutableLiveData<List<String>>()
    launch {
        val result = itemRepository.get(query)
        liveData.postValue(result)
    }
    return liveData
}

我的建议是不要将 LiveData 用作对 ViewModel 内部做出反应的东西,而是使用 BehaviorSubject 之类的东西来保存最新的查询并进行观察.

你可以这样做:

val searchQuery = BehaviorSubject.create<String>()
val items: LiveData<List<String>>

searchQuery
    .switchMap { itemRepository.get(query) }
    .subscribe( items.postValue(it) )

这样,你可以

  • 对查询中的变化做出反应。
  • 过滤小于 X 的查询(使用 .filter(...))
  • 如果另一个查询在第一个查询完成之前进入,则切换映射。
  • 有数据时post到LiveData。

实际上非常简单,您只需要放弃 Transformations.switchMap { 并使用您自己的习惯 MediatorLiveData。看:

val searchQuery = MutableLiveData<String>()
val items: LiveData<List<String>> = MediatorLiveData().also { mediator ->
    mediator.addSource(searchQuery) { query ->
        launch {
            val result = itemRepository.get(query)
            mediator.postValue(result)
        }
    }
}

它应该正常工作