Launch Apollo Studio

Get started with Kotlin


Apollo Android 3 is available in alpha. It is still in active development, and we'd love for folks to test it out. See the v3 documentation and please report any issues!

Add the Gradle plugin

First, obtain the latest version number of Apollo Android from the Releases page.

Then in your app's Gradle file, apply the com.apollographql.apollo3 plugin using one of the following methods (replace VERSION_NUMBER with the desired version number, such as 3.0.0):

Using the plugins DSL

build.gradle.kts
plugins {
  // ...
  id("com.apollographql.apollo3").version("VERSION_NUMBER")
}

Using the legacy syntax

build.gradle.kts
buildscript {
  // ...
  classpath("com.apollographql.apollo3:apollo-gradle-plugin:VERSION_NUMBER")
}

apply(plugin = "com.apollographql.apollo3")

The plugin is hosted on both the Gradle plugin portal and Maven Central.

By default, the plugin generates models in the root package name. You can configure this in the apollo {} block:

build.gradle[.kts]
apollo {
  packageName.set("com.example")
}

Configure the plugin

apollo {
  // instruct the compiler to generate Kotlin models
  generateKotlinModels.set(true)
}

Add the runtime dependencies

dependencies {
  // The core runtime dependencies
  implementation("com.apollographql.apollo:apollo-runtime:x.y.z")
  // Coroutines extensions for easier asynchronicity handling
  implementation("com.apollographql.apollo:apollo-coroutines-support:x.y.z")
}

Download your schema.json file

Apollo Android requires your GraphQL server's schema as either an introspection or SDL schema. Usually, it's a schema.[graphqls|json|sdl] file. This section shows how to obtain a schema from your server using introspection.

Note: If you don't have a GraphQL server yet, you can use the server from the tutorial: https://apollo-fullstack-tutorial.herokuapp.com/graphql.

The Apollo Gradle plugin exposes a downloadApolloSchema task to help you obtain your schema. Provide this task your server's GraphQL endpoint and the output location for the schema.json file:

(shell)
# Create a directory for your GraphQL files:
mkdir -p app/src/main/graphql/com/example/

# --schema is interpreted relative to the current working directory. This example
# assumes the root project directory and an Android app in `app`
./gradlew downloadApolloSchema \
  --endpoint="https://your.domain/graphql/endpoint" \
  --schema="app/src/main/graphql/com/example/schema.graphqls"

If your GraphQL endpoint requires authentication, you can pass custom HTTP headers:

(shell)
./gradlew downloadApolloSchema \
  --endpoint="https://your.domain/graphql/endpoint" \
  --schema="app/src/main/graphql/com/example/schema.graphqls" \
  --header="Authorization: Bearer $TOKEN"

Add your query

Put your first GraphQL query in a .graphql file, in the same directory as your downloaded schema: app/src/main/graphql/com/example/LaunchDetails.graphql

src/main/graphql/com/example/LaunchDetails.graphql
query LaunchDetails($id:ID!) {
  launch(id: $id) {
    id
    site
    mission {
      name
      missionPatch(size:LARGE)
    }
  }
}

Now build your project, which will generate the models. Either click the green triangle in Android Studio or run the following:

(shell)
./gradlew build

Execute your query

You use an instance of the ApolloClient class to interact with your server and cache.

To make a query using your generated models:

// First, create an `ApolloClient`
// Replace the serverUrl with your GraphQL endpoint
val apolloClient = ApolloClient.builder()
  .serverUrl("https://your.domain/graphql/endpoint")
  .build()

// in your coroutine scope, call `ApolloClient.query(...).toDeferred().await()`
scope.launch {
  val response = try {
    apolloClient.query(LaunchDetailsQuery(id = "83")).toDeferred().await()
  } catch (e: ApolloException) {
    // handle protocol errors
    return@launch
  }

  val launch = response.data?.launch
  if (launch == null || response.hasErrors()) {
    // handle application errors
    return@launch
  }

  // launch now contains a typesafe model of your data
  println("Launch site: ${launch.site}")
}

What's next

Edit on GitHub