我可以在 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)
}
}
}
它应该正常工作。
我正在使用带有 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)
}
}
}
它应该正常工作。