flutterstoragesharedpreferencesMahir3 mnt baca

SharedPreferences: Menyimpan Data Sederhana

Simpan pengaturan dan data kecil yang persisten dengan SharedPreferences secara async dan aman.

Untuk data kecil dan sederhana

Tidak semua data butuh database. Pilihan tema, status onboarding, token login, atau nama user cukup disimpan sebagai key-value. SharedPreferences adalah solusi standar Flutter untuk ini (di Android memakai SharedPreferences, di iOS memakai UserDefaults).

Setup dan penggunaan dasar

yaml
dependencies:
  shared_preferences: ^2.2.0
dart
import 'package:shared_preferences/shared_preferences.dart';

class PengaturanService {
  static const _keyTema = 'tema_gelap';
  static const _keyNama = 'nama_user';

  Future<void> simpanTemaGelap(bool aktif) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setBool(_keyTema, aktif);
  }

  Future<bool> bacaTemaGelap() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.getBool(_keyTema) ?? false;
  }

  Future<void> simpanNama(String nama) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_keyNama, nama);
  }

  Future<String?> bacaNama() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.getString(_keyNama);
  }
}

Tipe yang didukung: int, double, bool, String, dan List<String>. Tidak ada tipe lain, jadi objek kompleks harus di-encode jadi JSON string dulu.

Integrasi dengan Riverpod

Pola rapi adalah membungkus service dalam provider dan memuat nilai awal saat startup:

dart
final pengaturanServiceProvider = Provider<PengaturanService>((ref) {
  return PengaturanService();
});

final temaGelapProvider =
    NotifierProvider<TemaGelapNotifier, bool>(TemaGelapNotifier.new);

class TemaGelapNotifier extends Notifier<bool> {
  @override
  bool build() => false;

  Future<void> muat() async {
    final service = ref.read(pengaturanServiceProvider);
    state = await service.bacaTemaGelap();
  }

  Future<void> ubah(bool aktif) async {
    state = aktif;
    final service = ref.read(pengaturanServiceProvider);
    await service.simpanTemaGelap(aktif);
  }
}

UI update instan lewat state, penyimpanan berjalan di background. Panggil muat() sekali saat aplikasi start.

Batasan penting

SharedPreferences bukan tempat untuk data sensitif seperti password atau token penting, karena datanya tidak terenkripsi. Untuk itu pakai flutter_secure_storage. Juga bukan untuk data besar atau terstruktur (list transaksi), untuk itu pakai database seperti sqflite. Aturan praktis: kalau datanya bisa ditulis di satu baris sticky note, SharedPreferences cukup.

Catatan teknis: SharedPreferences.getInstance() adalah operasi async yang membaca dari disk. Jangan memanggilnya di dalam build karena akan dipanggil berulang. Ambil sekali, simpan instance-nya di service, atau bungkus dalam FutureProvider. Dan karena operasinya async, selalu ada jeda sebelum nilai tersedia, jadi siapkan nilai default yang masuk akal sambil menunggu.