Join us from October 8-10 in New York City to learn the latest tips, trends, and news about GraphQL federation and API platform engineering.Join us for GraphQL Summit 2024 in NYC
Docs
Start for Free

Fragments in Apollo Kotlin


NOTE

This article describes the behavior of when using the default operationBased codegen in . For the responseBased codegen, see this page.

Apollo Kotlin supports both forms of GraphQL fragments:

Named fragments

Take a look at the following definitions:

Launch.graphql
# Declaration of named fragment
fragment LaunchFragment on Launch {
id
site
mission {
name
}
}
query LaunchDetails($id:ID!) {
launch(id: $id) {
# Usage of named fragment
...LaunchFragment
}
}

Based on the fragment definition, Apollo Kotlin generates the following LaunchFragment class that you can reuse in different queries:

LaunchFragment.kt
data class LaunchFragment(
val id: String,
val site: String?,
val mission: Mission?
)

Generated models for that use this have a .launchFragment property for accessing the fragment's fields:

println("Mission site: ${launch.launchFragment?.site}")

The launchFragment property is null if the returned object is not a Launch.

You can reuse the fragment in any number of operations:

Launch.graphql
# ...previous definitions...
query LaunchList {
launches {
launches {
...LaunchFragment
}
}
}

You can even use a fragment in operations that are defined in a different .graphql file from the fragment itself. This is because Apollo Kotlin codegen merges all .graphql files in to a single file before generating models.

Inline fragments

Take a look at this definition that uses two inline fragments:

HeroForEpisode.graphql
query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
name
... on Droid {
primaryFunction
}
... on Human {
height
}
}
}

For this operation, Apollo Kotlin generates a Hero class that contains OnDroid and OnHuman nested classes. Hero also includes onDroid and onHuman fields that enable you to access fields that are specific to Droid and Human:

println("Droid primaryFunction: ${hero.onDroid?.primaryFunction}")
println("Human height: ${hero.onHuman?.height}")

These on<ShapeName> fields (onDroid and onHuman) are null if the returned object is not of the corresponding type.

Previous
Custom scalars
Next
@defer support
Rate articleRateEdit on GitHubEditForumsDiscord

© 2024 Apollo Graph Inc.

Privacy Policy

Company