Learn
← Previous Next →

Hari 22: State Management — Provider

60 min Last updated 09 Apr 2026

Mengapa State Management?

setState() bekerja baik untuk state lokal, tapi untuk state yang perlu dibagi antar banyak widget, kita perlu solusi seperti Provider.

// pubspec.yaml: provider: ^6.1.1
import "package:flutter/material.dart";
import "package:provider/provider.dart";

class CartProvider extends ChangeNotifier {
  List> _items = [];
  int get itemCount => _items.length;
  double get total => _items.fold(0, (sum, item) => sum + item["harga"]);

  void tambah(String nama, double harga) {
    _items.add({"nama": nama, "harga": harga});
    notifyListeners(); // beritahu widget untuk rebuild
  }

  void hapus(int index) {
    _items.removeAt(index);
    notifyListeners();
  }

  List> get items => List.unmodifiable(_items);
}

void main() => runApp(
  ChangeNotifierProvider(
    create: (_) => CartProvider(),
    child: MaterialApp(home: TokoPage()),
  ),
);

class TombolBeli extends StatelessWidget {
  final String nama;
  final double harga;
  const TombolBeli(this.nama, this.harga, {super.key});

  @override Widget build(BuildContext context) {
    final cart = context.read();
    return ElevatedButton(
      onPressed: () => cart.tambah(nama, harga),
      child: Text("Tambah ke Keranjang"),
    );
  }
}

class CartBadge extends StatelessWidget {
  @override Widget build(BuildContext context) {
    final count = context.watch().itemCount;
    return Badge(label: Text("$count"), child: Icon(Icons.shopping_cart));
  }
}

💡 Notice: notifyListeners() memberitahu semua subscriber (widget) untuk rebuild dengan data terbaru.

Assignment

Buat ThemeProvider dengan toggle dark/light mode dan simulasikan widget yang reactive.

Expected output:

Initial:
[AppBar] Theme: Light
[Body] Background: putih
Toggle dark mode:
[AppBar] Theme: Dark
[Body] Background: hitam
Toggle lagi:
[AppBar] Theme: Light
[Body] Background: putih
Dart main.dart
Solution
Output