所以,我有一个在 android 中使用 kotlin 流的寻呼机设置。我有一个从用户那里得到的字符串,每当发生变化时,我都会使用 flatmaplatest 运算符从 Pager 对象中获取最新的项目。寻呼机对象如下。
fun searchAedItem(search: String) {
viewModelScope.launch {
mutableSearchData.emit(search)
}
}
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)) { AedSearchSource(aedApi, gson) }.flow
}
以上在我的视图模型中,我在我的活动中观察这些如下:
lifecycleScope.launchWhenStarted {
viewmodel.searchFlow.collect {
IOLog.d("mutableSearchData", it.toString())
adapter?.submitData(it)
}
}
我的适配器似乎运行良好,因为当我用不同的列表显示它时没有问题
AedSearchSource 类看起来像这样。
class AedSearchSource(val aedApi: AedApi, val searchObje: JsonObject) :
PagingSource<Int, AedDevicesListItem>() {
override fun getRefreshKey(state: PagingState<Int, AedDevicesListItem>): Int? {
TODO("Not yet implemented")
}
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, AedDevicesListItem> {
return try {
val nextPage = params.key ?: 1
val response = aedApi.serachAed(searchObje, nextPage).await()
val list = response.body()!!
return if (list.isEmpty()) {
LoadResult.Error(Throwable("End of list reached."))
} else
LoadResult.Page(
data = list,
prevKey = if (nextPage == 1) null else nextPage - 1,
nextKey = nextPage.inc()
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
所以,问题是它只在第一次调用 api 并且执行良好时才起作用。然后随后我在 searchAedItem() Pager(PagingConfig(pageSize = 1)) { AedSearchSource(aedApi, gson) }.flow中有不同的文本时 没有执行。但是 flatMapLatest 执行得很好。但是 pager 对象不执行我想要搜索的那个 api。关于我做错了什么的任何想法?