加入我们,于10月8日至10日在纽约市学习有关GraphQL联邦和API平台工程的最新技巧、趋势和新闻。加入我们参加2024年纽约市的GraphQL峰会
文档
免费开始
您正在查看该软件先前版本的文档。 切换到最新稳定版本。

7. 分页结果


如您已注意到,由LaunchListQuery 返回的对象是一个 LaunchConnection。这个对象有一个 列表,一个分页 ,以及一个布尔值来表示是否还有更多发射存在。

当使用基于 cursor 的分页系统时,重要的是要记住,cursor 给您一个地方,在某个位置之后可以选择所有结果,无论在此期间是否添加了更多项目。

在前一节中,您直接在 SMALL 大小 中直接在 查询中硬编码,但您还可以使用 程序化定义参数。您将在这里使用它们来实现分页。

添加一个 cursor 变量,以及 cursorhasMore 字段

LaunchList.graphql 中添加一个 cursor 。在 GraphQL 中,变量以前面符号 $ 预置。

同时将 cursorhasMore 添加到 查询中,因为我们将在分页时使用它们:

app/src/main/graphql/LaunchList.graphql
query LaunchList($cursor: String) {
launches(after: $cursor) {
cursor
launches {
id
site
mission {
name
missionPatch(size: SMALL)
}
}
hasMore
}
}

您可以在沙盒探索器中使用名为 的下方面板来实验 GraphQL 变量。如果您省略 $cursor 变量,则服务器从开始返回数据:

Explorer variables

在到达列表末尾时获取下一页

声明并记住一个 cursor 变量,初始化为 null,并使 LauchedEffect。这样,每当 查询cursor 改变时,查询都将被重新执行。

同时保留 response 的引用,这样我们就可以进一步访问 hasMorecursor 字段。

app/src/main/java/com/example/rocketreserver/LaunchList.kt
@Composable
fun LaunchList(onLaunchClick: (launchId: String) -> Unit) {
var cursor: String? by remember { mutableStateOf(null) }
var response: ApolloResponse<LaunchListQuery.Data>? by remember { mutableStateOf(null) }
var launchList by remember { mutableStateOf(emptyList<LaunchListQuery.Launch>()) }
LaunchedEffect(cursor) {

将光标传递给 LaunchListQuery,然后在列表末尾添加一个特殊项,如果 hasNext 为真,则更新 cursor。当用户滚动到列表末端时,这将会触发一个新的使用新 cursor 的查询,并将 launchList 与新结果串联起来。

注意: 这是在 Compose 中实现分页的基本实现。在实际项目中,你可能需要使用更高级的技术,比如 Jetpack Paging 库

整个函数应该看起来是这样的

app/src/main/java/com/example/rocketreserver/LaunchList.kt
@Composable
fun LaunchList(onLaunchClick: (launchId: String) -> Unit) {
var cursor: String? by remember { mutableStateOf(null) }
var response: ApolloResponse<LaunchListQuery.Data>? by remember { mutableStateOf(null) }
var launchList by remember { mutableStateOf(emptyList<LaunchListQuery.Launch>()) }
LaunchedEffect(cursor) {
response = apolloClient.query(LaunchListQuery(Optional.present(cursor))).execute()
launchList = launchList + response?.data?.launches?.launches?.filterNotNull().orEmpty()
}
LazyColumn {
items(launchList) { launch ->
LaunchItem(launch = launch, onClick = onLaunchClick)
}
item {
if (response?.data?.launches?.hasMore == true) {
LoadingItem()
cursor = response?.data?.launches?.cursor
}
}
}
}

请注意我们使用了 Optional 来包裹 cursor,这是因为这个参数在查询中可以省略。

测试滚动

点击 运行。现在你可以看到从夸贾林群岛的首次 FalconSat 到所有的 SpaceX 发射历史了!

接下来,你将 添加一个详情视图,这将允许你在发射中预订座位。

上一页
6. 向列表添加更多信息
下一页
8. 添加详情视图
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,又名Apollo GraphQL。

隐私政策

公司