Flutter #49: Mengintegrasikan GraphQL dengan Flutter
GraphQL kini menjadi alternatif populer REST API karena fleksibilitasnya dalam memilih data yang dibutuhkan. Di artikel ini kita akan menyiapkan GraphQL client di Flutter, membuat query sederhana, dan menampilkan hasilnya dengan widget yang responsif.
1. Persiapan Server GraphQL (dummy)
Untuk demo cepat gunakan layanan publik https://countries.trevorblades.com/. Endpoint ini menyediakan data negara, kode, dan kapital.
2. Tambahkan Dependency
Buka pubspec.yaml dan tambahkan paket graphql_flutter:
dependencies:
flutter:
sdk: flutter
graphql_flutter: ^5.1.0
Jalankan flutter pub get.
3. Inisialisasi GraphQL Client
Buat file lib/graphql_client.dart:
import 'package:graphql_flutter/graphql_flutter.dart';
final HttpLink httpLink = HttpLink('https://countries.trevorblades.com/');
final GraphQLClient client = GraphQLClient(
cache: GraphQLCache(store: InMemoryStore()),
link: httpLink,
);
4. Definisikan Query
Kita ingin menampilkan nama negara dan kapital. Simpan query di file lib/queries.dart:
const String countriesQuery = r'''query GetCountries {
countries {
code
name
capital
}
}''';
5. Widget dengan Query Widget
graphql_flutter menyediakan widget Query yang menangani request dan streaming data.
import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'graphql_client.dart';
import 'queries.dart';
class CountriesPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GraphQLProvider(
client: ValueNotifier(client),
child: Scaffold(
appBar: AppBar(title: Text('Daftar Negara (GraphQL)')),
body: Query(
options: QueryOptions(document: gql(countriesQuery)),
builder: (result, {fetchMore, refetch}) {
if (result.isLoading) return Center(child: CircularProgressIndicator());
if (result.hasException) return Center(child: Text('Error: ${result.exception.toString()}'));
final List countries = result.data!['countries'];
return ListView.builder(
itemCount: countries.length,
itemBuilder: (_, i) {
final c = countries[i];
return ListTile(
leading: CircleAvatar(child: Text(c['code'])),
title: Text(c['name']),
subtitle: Text('Ibukota: ${c['capital'] ?? "-"}'),
);
},
);
},
),
),
);
}
}
Widget ini menampilkan loading spinner, menampilkan error bila ada, dan menampilkan daftar negara setelah data tersedia.
6. Menambahkan Routing
Di main.dart tambahkan route baru:
import 'countries_page.dart';
void main() async {
await initHiveForFlutter(); // diperlukan graphql_flutter
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter GraphQL Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: HomeScreen(),
routes: {
'/countries': (_) => CountriesPage(),
},
);
}
}
Tambahkan tombol di halaman utama untuk menavigasi ke /countries.
7. Testing Cepat
Jalankan flutter run. Jika berhasil, Anda akan melihat daftar semua negara dengan kode ISO dan ibu kotanya.
8. Tips Optimasi
- Cache:
graphql_flutterotomatis menyimpan data di memori. Untuk persisten, gunakanHiveStore. - Error handling: Periksa
result.exception?.linkExceptionuntuk jaringan, danresult.exception?.graphqlErrorsuntuk error server. - Pagination: Gunakan argumen
first,afterdi query danfetchMoredi widget.
9. Kesimpulan
GraphQL memberikan kontrol penuh atas data yang di‑fetch. Dengan graphql_flutter integrasi menjadi sangat simpel: definisi client, query, dan widget yang menampilkan hasil. Anda kini dapat memperluas aplikasi Flutter dengan sumber data fleksibel.
Coba sendiri! Share ke sosial media dan tag @ahsai001