Lewati ke isi

Pengenalan State Management Provider


Tujuan Pembelajaran

Setelah mengikuti pertemuan ini, siswa mampu:
1. Memahami apa itu state dan mengapa state penting
2. Menjelaskan keterbatasan penggunaan setState
3. Menggunakan Provider sebagai solusi state management
4. Memisahkan logic data dan tampilan (UI)
5. Menulis kode state management yang rapi dan mudah dikembangkan


Pertanyaan Pemantik

  • Pernahkah kalian membuat aplikasi yang datanya dipakai di banyak halaman?
  • Apa yang terjadi jika data tersebut berubah di satu halaman tapi tidak di halaman lain?

1. Masalah Nyata dalam Pengelolaan State

State adalah data yang bisa berubah dan memengaruhi tampilan aplikasi.

Contoh state:
- jumlah barang di keranjang
- status login
- data produk

Pada aplikasi kecil, state sering diletakkan langsung di halaman dan diubah dengan setState.

Masalah muncul ketika:
- data dipakai lebih dari satu halaman
- logic mulai banyak
- aplikasi semakin besar

Kalimat penting:

Masalahnya bukan di kodingnya, tapi di di mana data disimpan.


2. Studi Kasus Masalah (Tanpa Provider)

Bayangkan:
- jumlah item keranjang (cartCount)
- ditampilkan di Home dan Detail

Jika cartCount disimpan di HomePage:
- Detail tidak tahu perubahan
- data harus dikirim manual
- kode menjadi tidak rapi

Ini tanda bahwa:
- state tidak cocok hidup di halaman
- dibutuhkan tempat khusus untuk menyimpan data


3. Kenalan dengan Provider (Solusi)

Provider adalah:
- tempat menyimpan state
- bisa diakses banyak widget
- memberi tahu UI saat data berubah

Provider bukan untuk tampilan, tapi untuk mengelola data.

Perumpamaan:

Provider seperti TU sekolah
data disimpan di satu tempat, bukan di masing-masing kelas


4. ChangeNotifier dan notifyListeners

Provider biasanya dipadukan dengan ChangeNotifier.

Makna penting:
- Provider → tempat menyimpan state
- ChangeNotifier → kelas yang menyimpan data dan memberi tahu UI saat data berubah
- notifyListeners() → untuk mentrigger perubahan


5. Praktik Inti: Provider Dasar

A. Install Provider

Tambahkan di pubspec.yaml:

dependencies:
  provider: ^6.0.5

Jalankan:

flutter pub get


B. Membuat Provider

Buat folder dan file:

lib/
 └── providers/
     └── product_provider.dart
import 'package:flutter/material.dart';
import '../data/dummy_products.dart';
import '../models/product.dart';

class ProductProvider extends ChangeNotifier {
  // Sumber data utama (dummy)
  final List<Product> _allProducts = dummyProducts;

  // State untuk search
  String _query = "";

  String get query => _query;

  // Produk yang sudah ter-filter (hasil yang akan ditampilkan UI)
  List<Product> get products {
    final q = _query.trim().toLowerCase();
    if (q.isEmpty) return _allProducts;

    return _allProducts.where((p) {
      return p.name.toLowerCase().contains(q) ||
          p.category.toLowerCase().contains(q) ||
          p.description.toLowerCase().contains(q);
    }).toList();
  }

  // Update query search
  void setQuery(String value) {
    _query = value;
    notifyListeners();
  }

  // Ambil 1 produk berdasarkan id (untuk Detail)
  Product? getById(String id) {
    for (final p in _allProducts) {
      if (p.id == id) return p;
    }
    return null;
  }
}

Makna penting:
- _allProducts = sumber data
- _query = state search
- products = hasil filter yang siap ditampilkan
- notifyListeners() = memberi tahu UI untuk update


C. Daftarkan Provider di main.dart

MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => ProductProvider()),
  ],
  child: const MyApp(),
),

Makna:
- ProductProvider tersedia untuk semua halaman
- UI cukup “membaca” dan “memanggil method” dari Provider


File: lib/pages/home_page.dart

•󠁏 Import Provider

Tambahkan:

import 'package:provider/provider.dart';
import '../providers/product_provider.dart';

•󠁏 Search mengubah state di Provider

Pada TextField, ubah onChanged menjadi:

onChanged: (v) {
  context.read<ProductProvider>().setQuery(v);
},

•󠁏 Ambil list produk dari Provider untuk Grid

Saat membuat list/grid, ambil dari Provider:

final filtered = context.watch<ProductProvider>().products;

Lalu gunakan products sebagai sumber data grid.

Makna: - Ketika query berubah, Provider memanggil notifyListeners() - watch() membuat Home otomatis rebuild dengan data yang sudah terfilter


E. DetailPage: Ambil Produk Berdasarkan ID dari Provider

File: lib/pages/detail_page.dart

•󠁏 Import Provider

Tambahkan:

import 'package:provider/provider.dart';
import '../providers/product_provider.dart';

•󠁏 Ambil produk dari Provider

Di dalam build():

final product = context.read<ProductProvider>().getById(productId);

Lalu: - Jika product == null, tampilkan pesan “Produk tidak ditemukan” - Jika ada, tampilkan UI detail seperti biasa

Makna: - Detail tidak perlu membawa object besar - Detail cukup membawa id, lalu mengambil data dari sumber pusat (Provider)


Refleksi

Hari ini kalian sudah memakai pola yang sama seperti API: - Provider menyimpan data - UI menampilkan data - Search mengubah state - Detail mengambil data berdasarkan id

Saat nanti API: - _allProducts = dummyProducts diganti jadi hasil fetch API - UI tidak perlu dirombak besar