Overview #
Tidak semua data perlu disimpan — dan tidak semua data yang perlu disimpan butuh database penuh. Memilih solusi local storage yang tepat adalah keputusan arsitektur yang akan mempengaruhi performa, kompleksitas kode, dan kemudahan pemeliharaan aplikasi. Artikel ini memberikan peta lengkap ekosistem local storage Flutter sebelum kita menyelami setiap solusi secara mendalam.
Kapan Butuh Local Storage? #
TIDAK perlu local storage jika:
✓ Data selalu fresh dari server dan tidak perlu offline
✓ Data kecil dan sementara -- cukup simpan di state (RAM)
✓ Aplikasi selalu butuh koneksi untuk berfungsi
PERLU local storage jika:
✓ Butuh offline support -- app tetap bisa digunakan tanpa internet
✓ Cache data dari server untuk tampilan yang lebih cepat
✓ Simpan preferensi pengguna (tema, bahasa, pengaturan)
✓ Data yang dibuat pengguna sebelum sync ke server
✓ Menghindari request berulang untuk data yang jarang berubah
✓ Token auth, session data, onboarding state
Peta Ekosistem Local Storage Flutter #
SIMPEL (key-value):
SharedPreferences -- preferensi, settings, flag boolean
flutter_secure_storage -- token, data sensitif (sudah dibahas di Auth)
NOSQL (object store):
Hive -- cache ringan, data terstruktur sederhana
ObjectBox -- performa tinggi, relasi antar objek
SQL (relasional):
Drift -- type-safe SQL, query kompleks, migrasi terkelola
sqflite -- raw SQLite (Drift lebih direkomendasikan)
Perbandingan Fitur Lengkap #
| SharedPrefs | Hive | ObjectBox | Drift | |
|---|---|---|---|---|
| Tipe data | Primitif saja | Semua (dengan adapter) | Semua (dengan anotasi) | Semua (type-safe) |
| Query | Tidak ada | Terbatas | Query builder | SQL penuh |
| Relasi | Tidak ada | Manual | ToOne / ToMany | JOIN |
| Reactive stream | Tidak | Terbatas | ✓ watchQuery | ✓ watch() |
| Enkripsi | Tidak | ✓ AES-256 | Manual | Manual |
| Code generation | Tidak | Opsional | Wajib | Wajib |
| Web support | ✓ | ✓ | ✗ | ✓ |
| Performa tulis | Lambat | Cepat | Tercepat | Sedang |
| Performa baca | Lambat | Cepat | Tercepat | Sedang |
| Migrasi schema | N/A | Manual | Semi-otomatis | ✓ Terkelola |
| Kurva belajar | Rendah | Rendah | Sedang | Tinggi |
| Cocok untuk | Settings | Cache | Objek kompleks | Data relasional |
Benchmark Performa (Perkiraan) #
Operasi 1.000 item:
Tulis:
SharedPreferences : ~15.000 ms (sangat lambat untuk batch)
Hive : ~800 ms
ObjectBox : ~200 ms ← tercepat
Drift : ~400 ms
Baca:
SharedPreferences : ~8.000 ms
Hive : ~500 ms
ObjectBox : ~150 ms ← tercepat
Drift : ~300 ms
SharedPreferences memang jauh lebih lambat — tapi ia bukan untuk operasi batch. Ia didesain untuk satu-dua key, bukan ribuan item.
Decision Tree — Pilih yang Tepat #
Apa yang ingin kamu simpan?
│
├─ Pengaturan/preferensi sederhana (tema, bahasa, flag login)
│ → SharedPreferences
│
├─ Token auth atau data sensitif
│ → flutter_secure_storage (sudah dibahas di section Networking)
│
├─ Cache data dari API (list produk, artikel, dll.)
│ │
│ ├─ Data sederhana, tidak ada relasi antar objek
│ │ → Hive
│ │
│ └─ Data dengan relasi (produk punya kategori, user punya pesanan)
│ → ObjectBox atau Drift
│
├─ Data yang dibuat pengguna (todo, catatan, transaksi)
│ │
│ ├─ Butuh relasi antar entitas dan query yang fleksibel
│ │ → Drift
│ │
│ └─ Butuh performa tinggi atau sync otomatis
│ → ObjectBox
│
└─ Butuh dukungan web (Flutter Web)
├─ SharedPreferences atau Hive (keduanya support web)
└─ Drift (support web dengan WASM)
→ Hindari ObjectBox (tidak support web)
Bisa Menggunakan Lebih dari Satu? #
Ya — dan ini umum di aplikasi produksi:
// Kombinasi yang sering digunakan:
SharedPreferences → tema, bahasa, onboarding state, flag
Hive → cache response API (produk, artikel)
ObjectBox → data offline yang dibuat pengguna
flutter_secure_storage → token auth
// Contoh di aplikasi e-commerce:
SharedPreferences: isDarkMode, selectedLanguage, hasSeenOnboarding
Hive: cachedProdukList, cachedKategori
ObjectBox: draftPesanan, produkFavorit, riwayatPencarian
Yang penting: jangan duplikasi data — setiap data disimpan di satu tempat saja.
Yang Sengaja Tidak Dibahas #
Isar — sempat populer, tapi ditinggalkan oleh pembuatnya dan kini dirawat oleh komunitas. Tidak direkomendasikan untuk proyek baru.
sqflite — package SQLite raw yang lebih rendah level. Drift dibangun di atasnya dan jauh lebih ergonomis. Gunakan Drift alih-alih sqflite langsung.
Realm — deprecation diumumkan September 2024 oleh MongoDB. Tidak direkomendasikan untuk proyek baru.
Ringkasan #
- Local storage dibutuhkan untuk offline support, caching, preferensi pengguna, dan data yang dibuat pengguna sebelum sync ke server.
- SharedPreferences untuk data key-value sederhana seperti settings dan flag — cepat diimplementasikan, tidak butuh setup kompleks.
- Hive untuk cache data terstruktur yang tidak butuh relasi antar objek — cepat, ringan, mendukung web.
- ObjectBox untuk data objek yang kompleks dengan relasi — performa tertinggi, relasi ToOne/ToMany built-in, tapi tidak support web.
- Drift untuk data relasional yang kompleks — SQL penuh, migrasi schema terkelola, reactive stream, support semua platform termasuk web.
- Boleh menggunakan lebih dari satu solusi dalam satu aplikasi — sesuaikan dengan kebutuhan setiap jenis data.
- Hindari Isar (ditinggalkan maintainer), sqflite langsung (Drift lebih baik), dan Realm (deprecated 2024).
← Sebelumnya: Networking Best Practice Berikutnya: SharedPreferences →