Apollo Kotlin中的片段
注意:本文描述了当使用默认的片段时的行为。operationBased
代码生成在Apollo Kotlin中。对于responseBased
代码生成,请参阅此页面。
Apollo Kotlin支持两种形式的GraphQL片段:
命名片段
以下是一个GraphQL定义的示例:
Launch.graphql
# Declaration of named fragmentfragment launchFragment on Launch {idsitemission {name}}query LaunchDetails($id:ID!) {launch(id: $id) {# Usage of named fragment...launchFragment}}
根据fragment
定义,Apollo Kotlin生成了以下LaunchFragment
类,你可以在不同的查询中复用它:
LaunchFragment.kt
data class LaunchFragment(val id: String,val site: String?,val mission: Mission?)
使用此fragment的operations操作生成生成的模型具有.launchFragment
属性以访问fragment的字段:
println("Mission site: ${launch.launchFragment?.site}")
如果返回的对象不是Launch
,则launchFragment
属性为null
。
您可以在任何数量的操作中重用此fragment:
Launch.graphql
# ...previous definitions...query LaunchList {launches {launches {...launchFragment}}}
即使是在从自己的.graphql
文件中定义的操作中,您也可以使用fragment。这是因为在不生成模型之前,Apollo Kotlin codegen会将所有的.graphql
文件合并到一个单个文件中。
内联片段
请查看这个使用两个内联query定义的片段:
HeroQuery.graphql
query HeroForEpisode($ep: Episode!) {hero(episode: $ep) {name... on Droid {primaryFunction}... on Human {height}}}
对于此操作,Apollo Kotlin生成一个Hero
类,该类包含嵌套的OnDroid
和OnHuman
类。Hero
还包括onDroid
和onHuman
字段,使您能够访问Droid
和Human
的特定字段:
println("Droid primaryFunction: ${hero.onDroid?.primaryFunction}")println("Human height: ${hero.onHuman?.height}")
这些on<ShapeName>
字段(onDroid
和 onHuman
)在返回的对象不是相应的类型时为 null
。