因此,我有两个流具有来自两个不同 Api 的相同响应。我只有一个 recyclerview 分页适配器。现在,当满足某些条件时如何在两个流之间切换。例如,我有一个 SearchView,如果有人输入,我必须调用一个 API 来获取一个响应。如果我清除 SearchView,我必须从不同的 api 返回响应,但返回到附加的同一个 Recyclerview。
val mySecondList =
flowOf(
clearListCh.receiveAsFlow().map { PagingData.empty() },
Pager (PagingConfig(pageSize = 1)) {
somePagingSource(aedApi)
}.flow.cachedIn(viewModelScope)
).flattenMerge(2)
val searchFlow = mutableSearchData.flatMapLatest {
IOLog.d(TAG, "search Flow happening..$it")
val jsonObject = JSONObject()
jsonObject.put("keyword", it)
val gson = getGsonObject(jsonObject)
Pager(PagingConfig(pageSize = 1, enablePlaceholders = true)) {
someSearchSource(aedApi, gson)
}.flow
}
private val clearListCh = Channel<Unit>(Channel.CONFLATED)
private val mutableLIve: MutableLiveData<String> = MutableLiveData()
val liveStringData = mutableLIve
fun clearListChannel() {
IOLog.d(TAG, "clearListCh called..")
clearListCh.offer(Unit)
}
在 onCreate 的活动中,我正在初始化如下所示的内容
lifecycleScope.launchWhenStarted {
viewmodel.searchFlow.collectLatest {
IOLog.d("mutableSearchData", it.toString())
adapter?.submitData(it)
}
}
lifecycleScope.launchWhenStarted {
viewmodel.mySecondList.collectLatest {
adapter?.submitData(it)
}
}
如何在从一个范围发送到另一个范围的提交数据之间进行切换
一般来说,您希望从中收集单个流,以便您可以依靠
collectLatest
取消上一代。在这种情况下,您应该使用类似 flattenMerge
的内容将两个流程组合在一起,就像您对第一个流程所做的那样