1

所以,我有一个在 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。关于我做错了什么的任何想法?

4

1 回答 1

0

确保使用.collectLatestfrom yourFlow<PagingData>以便在上一代被新的搜索词取代后取消它。

于 2021-06-12T03:34:35.213 回答