Pernah nggak kamu pakai aplikasi cuaca, buka harga saham real-time, atau scroll feed berita yang terus update — lalu bertanya-tanya: "Data ini dari mana, sih?" Jawabannya: dari REST API. Nah, di artikel ke-14 seri Dart from Zero to Zorro ini, kita akan belajar cara Flutter berkomunikasi dengan dunia luar lewat REST API Flutter SharedPreferences — mulai dari mengambil data dari internet, mengolah JSON, sampai menyimpannya secara lokal agar aplikasimu tetap responsif meski tanpa koneksi. Topik ini adalah jantung dari hampir semua aplikasi modern, jadi siapkan kopi dan editor kamu!
📚
Bagian dari Seri
Dart from Zero to Zorro
Artikel ini adalah bagian ke-14 dari 16 artikel seri belajar Dart & Flutter lengkap — dari nol sampai bisa bikin aplikasi sungguhan.
Bayangkan kamu lapar dan pesan makanan lewat ojek online. Kamu (aplikasi) meminta makanan (data) ke restoran (server) melalui kurir (HTTP request). Restoran menyiapkan pesanan dan mengirimkannya kembali (HTTP response). Itulah cara kerja REST API — sebuah protokol komunikasi berbasis HTTP yang memungkinkan aplikasi berbicara dengan server.
Di Flutter, kita menggunakan package http untuk mengirim request ke server dan menerima respons dalam format JSON (JavaScript Object Notation) — format data ringan yang mirip Map di Dart.
💡 Formula Konsep
Flutter App → HTTP Request → REST API Server
REST API Server → JSON Response → Flutter App
JSON Response → Dart Object → SharedPreferences (simpan lokal)
💡
Tips Pemula
JSON itu essentially String terstruktur. Di Dart, kita decode-nya jadi Map<String, dynamic> menggunakan jsonDecode(). Gampang kan?
Method
Fungsi
Analogi
GET
Ambil data dari server
Baca menu restoran
POST
Kirim data baru ke server
Pesan makanan baru
PUT
Update data yang ada
Ubah pesanan
DELETE
Hapus data di server
Batalkan pesanan
🔧 Praktik REST API Flutter: Fetch & Tampilkan Data JSON
Cukup teorinya — mari kita langsung coding! Kita akan membuat fitur yang mengambil data user dari API publik JSONPlaceholder (https://jsonplaceholder.typicode.com) — API gratis yang sempurna untuk belajar.
Jalankan flutter pub get setelah menyimpan file ini.
2
Buat Model Class User
lib/models/user.dart
class User {
final int id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
// Buat objek User dari JSON (Map)
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
name: json['name'],
email: json['email'],
);
}
// Ubah objek User jadi JSON String (untuk disimpan)
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'email': email,
};
}
3
Buat Service: Fetch Data dari REST API
lib/services/api_service.dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../models/user.dart';
class ApiService {
static const String baseUrl =
'https://jsonplaceholder.typicode.com';
// Ambil list semua users
Future<List<User>> fetchUsers() async {
final response = await http.get(
Uri.parse('$baseUrl/users'),
);
if (response.statusCode == 200) {
// Decode JSON array menjadi List<Map>
final List<dynamic> jsonList = jsonDecode(response.body);
// Konversi tiap item jadi objek User
return jsonList.map((json) => User.fromJson(json)).toList();
} else {
throw Exception('Gagal memuat data: ${response.statusCode}');
}
}
}
⚡
Insight Penting
Perhatikan kata kunci async dan await! HTTP request adalah operasi asynchronous — aplikasi tidak bisa "freeze" menunggu server. Dengan Future + await, Flutter bisa melakukan hal lain sambil menunggu respons.
💾 SharedPreferences: Simpan Data Lokal di Flutter
Setelah berhasil ambil data dari REST API, pertanyaan berikutnya: "Gimana caranya data ini tetap ada meski user tutup aplikasi?" Jawabannya adalah SharedPreferences — penyimpanan key-value sederhana yang disimpan di perangkat pengguna, mirip seperti "catatan tempel" di ponsel mereka.
SharedPreferences cocok untuk data kecil dan sederhana: token login, preferensi tema, data user terakhir, dan lain-lain. Bukan untuk database besar — itu tugas SQLite atau Hive.
🔍 Perbandingan Opsi Penyimpanan Lokal Flutter
Opsi
Ukuran Data
Cocok Untuk
Kompleksitas
SharedPreferences
Kecil (KB)
Settings, token, flag
Mudah ✅
SQLite / sqflite
Besar (MB)
Database relasional
Sedang ⚠️
Hive
Besar (MB)
NoSQL lokal, cepat
Kompleks 🔥
4
Implementasi SharedPreferences — Simpan & Baca Data
lib/services/storage_service.dart
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/user.dart';
class StorageService {
static const String _usersKey = 'cached_users';
// Simpan list users ke SharedPreferences
Future<void> saveUsers(List<User> users) async {
final prefs = await SharedPreferences.getInstance();
// Encode list jadi JSON String
final String jsonString = jsonEncode(
users.map((u) => u.toJson()).toList(),
);
await prefs.setString(_usersKey, jsonString);
}
// Ambil list users dari SharedPreferences
Future<List<User>> loadUsers() async {
final prefs = await SharedPreferences.getInstance();
final String? jsonString = prefs.getString(_usersKey);
if (jsonString == null) return []; // Belum ada data tersimpan
final List<dynamic> jsonList = jsonDecode(jsonString);
return jsonList.map((json) => User.fromJson(json)).toList();
}
// Hapus data yang tersimpan
Future<void> clearUsers() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_usersKey);
}
}
5
Gabungkan di Widget — Fetch API & Cache dengan SharedPreferences
Pola "load cache dulu, fetch API kemudian" ini disebut Stale-While-Revalidate. Aplikasi seperti Twitter, Instagram, dan TikTok menggunakan strategi ini supaya konten muncul instan, bahkan sebelum data baru tiba dari server!
🛡️ Error Handling & Best Practices REST API Flutter SharedPreferences
Aplikasi production-ready bukan hanya soal kode yang bisa jalan — tapi kode yang tahan banting. Koneksi internet bisa putus, server bisa down, data bisa corrupt. Berikut pola penanganan error yang wajib kamu tahu:
⚠️
Perhatian!
Jangan lupa tambahkan permission internet di Android! Buka file android/app/src/main/AndroidManifest.xml dan tambahkan baris: <uses-permission android:name="android.permission.INTERNET"/>
Error Handling Pattern
Future<List<User>> fetchUsers() async {
try {
final response = await http
.get(Uri.parse('$baseUrl/users'))
.timeout(Duration(seconds: 10)); // Timeout 10 detik
switch (response.statusCode) {
case 200:
return (jsonDecode(response.body) as List)
.map((j) => User.fromJson(j))
.toList();
case 404:
throw Exception('Data tidak ditemukan (404)');
case 500:
throw Exception('Server bermasalah (500)');
default:
throw Exception('Error: ${response.statusCode}');
}
} on TimeoutException {
throw Exception('Koneksi timeout — cek internet kamu!');
} on SocketException {
throw Exception('Tidak ada koneksi internet');
}
}
💡
Best Practices SharedPreferences
Gunakan konstanta untuk key (bukan hardcode string di sana-sini)
SharedPreferences hanya untuk data ringan — jangan simpan list ribuan item
Selalu handle kasus data null (user baru install app)
Enkripsi data sensitif — pakai flutter_secure_storage untuk token auth
📝 Kesimpulan — Artikel 14
Yang Sudah Kamu Kuasai Hari Ini!
Di artikel ke-14 ini, kamu telah berhasil menaklukkan dua konsep vital dalam pengembangan aplikasi Flutter: berkomunikasi dengan server melalui REST API menggunakan package http, dan menyimpan data secara persisten menggunakan SharedPreferences. Kombinasi REST API Flutter SharedPreferences ini adalah fondasi dari hampir semua aplikasi mobile modern — dari e-commerce, berita, hingga media sosial.
Kamu sudah belajar: membuat model class, mem-fetch data JSON, mengolahnya menjadi objek Dart, menyimpan dan membaca dari storage lokal, hingga pola caching cache-first untuk pengalaman pengguna yang lebih mulus. Satu langkah lagi menuju developer Flutter profesional! 🚀
💬 Punya pertanyaan? Atau sudah berhasil coba kodenya? Ceritain pengalamanmu di kolom komentar di bawah — siapa tahu bisa bantu teman-teman lain yang juga lagi belajar!
📤 Bagikan artikel ini ke teman yang lagi belajar Flutter — karena belajar bareng itu lebih seru! 🎉
saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux
No comments:
Post a Comment