Mutations in Apollo Kotlin
Mutations are GraphQL operations that modify back-end data. As a convention in GraphQL,
Defining a mutation
You define a mutation in your app just like you define a query, except you use the mutation
keyword. Here's an example mutation for upvoting a post:
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {idvotes}}
And here's an example schema snippet that supports this mutation:
type Mutation {upvotePost(postId: Int!): Post}type Post {id: Int!votes: Int!content: String!}
The fields of the Mutation
type (such as upvotePost
above) usually describe the actions that mutations can perform. These fields usually take one or more arguments, which specify the data to create or modify.
Mutation return types
The return type of a Mutation
field usually includes the backend data that's been modified. This provides the requesting client with immediate information about the result of the mutation.
In the example above, upvotePost
returns the Post
object that's just been upvoted. Here's an example response:
{"data": {"upvotePost": {"id": "123","votes": 5}}}
For more information on mutation return types, see
Generating mutation classes
Similar to queries, mutations are represented by instances of generated classes, conforming to the Mutation
interface.
Constructor arguments are used to define mutation variables. You pass a mutation object
to ApolloClient#mutation(mutation)
to send the mutation to the server, execute it, and receive typed results:
val upvotePostMutation = UpvotePostMutation(postId = 3)val response = try {apolloClient.mutation(upvotePostMutation).execute()} catch(e: ApolloException) {// handle error}
Using fragments in mutation results
In many cases, you'll want to use mutation results to update your UI.
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {...PostDetails}}
Passing input objects
The GraphQL type system includes
mutation CreateReviewForEpisode($episode: Episode!, $review: ReviewInput!) {createReview(episode: $episode, review: $review) {starscommentary}}
val reviewInput = ReviewInput(stars = 5, commentary = "This is a great movie!")try {val response = apolloClient.mutation(CreateReviewForEpisodeMutation(episode = Episode.NEWHOPE, review = reviewInput)).execute()} catch (e: ApolloException) {// handle exception}