我在 Kotlin 应用程序(JVM 命令行应用程序,而不是 Android)中使用 Apollo 客户端来获取分页数据,每个“页面”都被添加到一个列表中。理论上,使用 runBlocking 应该允许调用函数获取 Apollo 客户端获取的数据,但它似乎在实践中不起作用 - 请参见下面的示例代码。完成此任务的正确(或至少更好)方法是什么?
// Simple pagination using Apollo client
class FooSource(private val query: String, private val apolloClient: ApolloClient) {
override suspend fun load(params: PageParams): LoadResult<Foo> {
val response = try {
apolloClient.query(
FooQuery(
queryString = query,
pageSize = params.pageSize,
cursor = params.cursorNext
)
).execute()
} catch (e: Exception) {
return LoadResult(e)
}
// Successfully prints a non-zero list size
println("Source data: ${response.data.size}")
return LoadResult(result.data, result.endCursor)
}
}
// Fetch the data
fun getData(query: String, apolloClient: ApolloClient) {
var source = FoodSource(query, apolloClient)
val data = mutableListOf<T>()
var hasNext = false
do {
val result = runBlocking {
source.load(params)
}
// Shows as zero, since we always recieve an empty list
println("Recieved data: ${response.data.size}")
data.addAll(result.data)
params.cursorNext = result.cursorNext
hasNext = result.hasNext()
} while (hasNext)
}