State Management Modern Flutter
Tekan → atau klik tombol panah untuk mulai belajar
State = data yang bisa berubah dalam aplikasi (misalnya jumlah item keranjang, status login, isi form). State Management adalah cara kita mengatur, menyimpan, dan membagikan data itu ke seluruh layar dengan rapi.
Tempat data "dimasak" dan disimpan. Satu sumber kebenaran (single source of truth).
Mengantarkan "masakan" (data) dari dapur ke meja pelanggan tanpa pelanggan harus masuk dapur.
Menerima data dan menampilkannya. Saat masakan diganti, piring otomatis diperbarui.
ChangeNotifier adalah kelas Flutter yang bisa memberi tahu ("notify") semua pendengar ketika datanya berubah. Ia memanggil notifyListeners() untuk berteriak: "Hei, ada perubahan!"
Lonceng (ChangeNotifier) berbunyi satu kali, dan semua siswa (widget pendengar) langsung bereaksi. ChangeNotifier tidak perlu tahu siapa saja yang mendengarkan — ia cukup membunyikan notifyListeners().
notifyListeners(), data berubah tapi UI tidak ikut berubah. Lonceng wajib dibunyikan!Klik tombol di bawah. Saat increment() dipanggil → notifyListeners() berbunyi → layar otomatis diperbarui. Perhatikan kilatan emas saat UI rebuild!
increment()_count++ mengubah datanotifyListeners() 🔔 memberi kabarCoba bayangkan baris notifyListeners() dihapus. Data _count tetap naik di belakang layar, tapi angka di layar diam di 0. UI dan data jadi tidak sinkron. ⚠️
Provider "membungkus" widget tree dan menyediakan objek state agar bisa diakses oleh widget mana pun di bawahnya — tanpa harus mengoper data manual lewat constructor.
Tanpa Provider, kamu harus mengoper data lewat setiap constructor widget (disebut "prop drilling" — capek!). Provider menaruh dispenser di atas, semua anak tinggal "minum". 💧
Node muncul satu per satu — perhatikan panah yang mengalir menandakan arah data 👀
read di dalam onPressed, gunakan watch di dalam build untuk teks.Consumer adalah widget yang "mendengarkan" Provider dan hanya membangun ulang bagian di dalamnya saat state berubah. Ini lebih hemat daripada me-rebuild seluruh layar.
Hanya radio yang menyetel frekuensi (Consumer yang berlangganan) yang menerima siaran. Widget lain yang tidak "nyetel" tidak terganggu — itulah efisiensi Consumer.
Klik tombol. Perhatikan: hanya node Consumer<Counter> yang menyala (rebuild). Widget lain di pohon tidak ikut dibangun ulang — itu efisien!
Node yang menyala emas = sedang rebuild. Lihat hanya Consumer yang bereaksi ✅
Consumer agar aplikasi tetap cepat dan ringan. 🚀Aplikasi nyata punya banyak state: keranjang, user login, tema, bahasa… MultiProvider memasang banyak Provider sekaligus secara rapi.
Satu panel listrik (MultiProvider) punya banyak sekring (Provider). Lampu, TV, AC, dan charger masing-masing mengambil listrik dari sekringnya sendiri. Rapi dan terpusat!
State keranjang belanja
State login pengguna
State tema gelap/terang
Riverpod dibuat oleh pengembang yang sama dengan Provider (bahkan namanya anagram dari "Provider"! 🔤). Ia memperbaiki kelemahan Provider dan lebih aman.
| Aspek | Provider | Riverpod |
|---|---|---|
| Butuh BuildContext? | Ya, perlu context | Tidak wajib 🎉 |
| Error saat salah ketik tipe | Ketahuan saat running (telat) | Ketahuan saat menulis kode ✅ |
| Global state | Agak sulit | Sangat mudah 🌐 |
| Testing | Lumayan | Sangat mudah dites |
Untuk memakai Riverpod, bungkus seluruh aplikasi dengan ProviderScope. Ia ibarat "fondasi" tempat semua provider Riverpod hidup.
Ref (reference) adalah objek "remote serbaguna" untuk berinteraksi dengan provider: membaca, mendengarkan, atau mengubah state.
Satu kunci master (Ref) bisa membuka semua pintu (provider) di hotel. Dengan Ref kamu tidak butuh context untuk mengakses state.
Dengarkan & rebuild saat berubah
Baca sekali, tanpa listen (untuk aksi)
Jalankan efek samping (mis. tampilkan snackbar)
StateNotifier menyimpan state plus logika untuk mengubahnya di satu tempat yang rapi. State-nya immutable — diganti baru, bukan diubah langsung.
Kamu tidak mengubah TV secara langsung — kamu pakai remote (StateNotifier) yang punya tombol-tombol (method) untuk ganti channel (state) dengan aman.
Karena provider Riverpod dideklarasikan di luar widget, ia menjadi global: bisa diakses dari layar mana pun tanpa mengoper apa pun. Sempurna untuk data login, keranjang, atau tema.
Satu sumber data, dibaca banyak layar — semua otomatis tersinkronisasi 🔄
Kita bangun aplikasi keranjang belanja sederhana memakai Riverpod + StateNotifier. Inilah penerapan semua materi BAB 5!
daftar produk + tombol tambah
item terpilih + total harga
add(), remove(), totalKlik produk untuk menambah ke keranjang. Perhatikan animasi item terbang 🛫, badge bertambah, dan total ter-update otomatis — persis cara cartProvider bekerja!
Keranjang masih kosong
Jawab 5 soal berikut. Klik jawaban → langsung tahu benar/salah. Skor muncul di bawah!
Buat aplikasi counter sederhana memakai Riverpod. Ikuti langkah-langkah, lalu cocokkan dengan kunci jawaban.
StateProvider<int> global bernama counterProvider dengan nilai awal 0.MyApp dengan ProviderScope di main().extends ConsumerWidget.ref.watch(counterProvider) dan tampilkan di Text.ref.read(counterProvider.notifier).state++.watch untuk menampilkan, read untuk aksi tombol. Provider dideklarasikan di luar kelas agar global!Terapkan seluruh ilmu BAB 5 untuk membangun aplikasi Todo List yang fungsional menggunakan Riverpod + StateNotifier.
Todo (id, judul, selesai/belum)TodoNotifier extends StateNotifier<List<Todo>>todoProvider global| Kriteria | Bobot | Indikator |
|---|---|---|
| StateNotifier benar | 30% | State immutable, method add/remove/toggle bekerja |
| Global Provider | 20% | todoProvider dideklarasikan global & dipakai dengan ref |
| Fungsionalitas UI | 25% | Tambah, hapus, tandai selesai berjalan mulus |
| Reactivity | 15% | UI update otomatis tanpa setState manual |
| Kerapian kode | 10% | Struktur file rapi, penamaan jelas |
Kamu kini menguasai Provider, Consumer, MultiProvider, Riverpod, Ref, StateNotifier, dan Global State. Lanjutkan ke BAB 6! 🚀