Episode 28 membawa GraphQL ke mobile: Apollo Client di React Native dengan persistensi AsyncStorage, arsitektur offline-first dengan antrean mutation dan sinkronisasi, optimasi performa untuk jaringan mobile, hingga integrasi Flutter dengan package graphql_flutter.

Mobile adalah alasan utama GraphQL diciptakan — Facebook membangunnya demi aplikasi iOS yang hemat bandwidth. Episode 28 membawa GraphQL ke dunia mobile dengan React Native dan Flutter.
Kita akan membangun Apollo Client di React Native, mempersist cache ke AsyncStorage, merancang arsitektur offline-first dengan antrean mutation, mengoptimalkan performa untuk jaringan mobile, dan menutup dengan integrasi Flutter.
Apollo Client berjalan di React Native hampir sama dengan di web. Bedanya, pengaturan jaringan dan penyimpanan disesuaikan platform. Install dengan npm install @apollo/client graphql @react-native-async-storage/async-storage:
import { ApolloClient, InMemoryCache, createHttpLink } from "@apollo/client";
import { AsyncStorageWrapper, persistCache } from "apollo3-cache-persist";
import AsyncStorage from "@react-native-async-storage/async-storage";
const cache = new InMemoryCache();
persistCache({
cache,
storage: new AsyncStorageWrapper(AsyncStorage),
});
export const client = new ApolloClient({
link: createHttpLink({ uri: "https://api.kalian.com/graphql" }),
cache,
});AsyncStorage mempersist cache ke penyimpanan lokal perangkat. Akibatnya: data yang pernah dimuat tetap tersedia saat aplikasi dibuka kembali, dan pengguna tidak perlu menunggu network untuk melihat data yang sudah pernah dimuat.
Gunakan URL API yang bisa diakses dari perangkat — localhost di emulator tidak menunjuk ke mesin pengembang. Untuk development, perhatikan konfigurasi Android emulator dan iOS simulator. Hindari menyimpan token di AsyncStorage tanpa enkripsi; gunakan secure storage seperti react-native-keychain untuk token refresh.
Arsitektur offline-first berarti aplikasi tetap berfungsi tanpa koneksi. Konsep intinya: mutation yang gagal karena offline dimasukkan ke antrean, dan diproses saat koneksi kembali:
import { from, Observable } from "rxjs";
function createOfflineQueueLink() {
const queue = [];
return from(new Observable((observer) => {
if (navigator.onLine) {
return forward(operation).subscribe(observer);
}
queue.push(operation);
observer.complete();
}));
}Setelah koneksi pulih, jalankan ulang seluruh antrean secara berurutan (mutation dieksekusi serial, episode 5). Tambahkan idempotency key pada mutation agar operasi yang dikirim ulang tidak menimbulkan data ganda.
Optimistic UI menjadi lebih penting di mobile: saat offline, tampilkan perubahan segera berdasarkan optimisticResponse, lalu sinkronkan saat response asli tiba. Untuk conflict resolution saat dua perangkat mengubah data yang sama, terapkan strategi seperti last-write-wins atau versi per field — detailnya dibahas di episode 38.
Jaringan mobile mahal dan tidak stabil. Optimasi yang wajib:
import { ApolloClient, InMemoryCache } from "@apollo/client";Hindari meng-import seluruh library; gunakan import selektif dan code splitting agar bundle React Native tetap kecil. Untuk gambar, sajikan lewat CDN dengan ukuran yang sesuai perangkat.
Sesuaikan perilaku dengan kondisi jaringan: kurangi polling saat aplikasi di background, naikkan ukuran cache saat di Wi-Fi, dan tampilkan data cache dulu (cache-first) di jaringan lambat. Deteksi koneksi dengan @react-native-community/netinfo dan ubah fetchPolicy secara dinamis.
Untuk Flutter, package resmi dari komunitas adalah graphql_flutter:
dependencies:
graphql_flutter: ^5.1.0import 'package:graphql_flutter/graphql_flutter.dart';
final client = GraphQLClient(
link: HttpLink('https://api.kalian.com/graphql'),
cache: GraphQLCache(store: HiveStore()),
);Query dan mutation dilakukan lewat widget atau ekstensi:
Query(
options: QueryOptions(
document: gql('''
query GetUser(\$id: ID!) {
user(id: \$id) { id username }
}
'''),
variables: {'id': userId},
),
builder: (result, {fetchMore, refetch}) {
if (result.isLoading) return Text('Memuat...');
return Text(result.data!['user']['username']);
},
)graphql_flutter juga mendukung subscriptions dan cache persistence dengan Hive — cukup untuk membangun aplikasi Flutter full-stack GraphQL dengan pola yang sama seperti React Native.
Inti yang harus dibawa pulang:
Di episode 29 selanjutnya kalian akan mempelajari ekosistem tooling GraphQL — tools visualisasi dan desain schema, alat testing API seperti Apollo Studio Explorer dan Insomnia, manajemen schema dengan GraphQL Inspector, ekstensi IDE, CLI tools, hingga mock servers. Workflow pengembangan GraphQL kalian akan jauh lebih produktif!