Lompat ke konten utama
←

Flutter Dasar: Dart, Widget, dan State

Pelajaran 10 dari 18

State, navigasi, dan formulir

setState dan siklus hidup State

Setelah pelajaran ini kamu bisa menjelaskan apa yang dilakukan setState, urutan initState, build, dan dispose, serta tempat yang benar untuk menyiapkan dan membersihkan sumber daya.

  • ±13 menit
  • 3 latihan
  • Diperiksa 28 Okt 2026

Latihan di pelajaran ini butuh akun gratis. Progres, kode, dan catatanmu hanya tersimpan di browser ini. Masuk untuk menyimpannya

Materi

Di dalam State, data yang berubah disimpan sebagai field biasa, misalnya int _sisa = 12. Mengubah field itu saja tidak mengubah layar. setState(() { _sisa--; }) mengubah nilainya sekaligus memberi tahu Flutter bahwa State ini perlu dibangun ulang, lalu framework memanggil build lagi dan tampilan mengikuti nilai baru. Tanpa setState, build tidak dipanggil ulang, dan seolah tidak terjadi apa-apa.

class _StokState extends State<Stok> {
  int _sisa = 12;
  late final TextEditingController _catatan;

  @override
  void initState() {
    super.initState(); // selalu di baris pertama
    _catatan = TextEditingController();
  }

  @override
  void dispose() {
    _catatan.dispose(); // bersihkan sebelum State dibuang
    super.dispose(); // di baris terakhir
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      Text('Sisa: $_sisa'),
      TextField(controller: _catatan),
      ElevatedButton(
        onPressed: () => setState(() => _sisa--),
        child: const Text('Jual satu'),
      ),
    ]);
  }
}

Siklus hidup State berjalan begini. Setelah createState, Flutter memasukkan State ke pohon dan memanggil initState tepat sekali. Di sanalah controller, langganan, atau Future yang cukup dibuat sekali disiapkan, diawali super.initState(). build bisa dipanggil berkali-kali, setiap setState dan kapan pun framework membutuhkannya, jadi build tidak boleh mengirim permintaan jaringan. Saat State tidak lagi dibutuhkan, Flutter memanggil dispose untuk membersihkan controller dan timer, diakhiri super.dispose().

Jadi urutannya: createState, initState, build pertama, build lagi setiap ada setState, lalu dispose. Pembagian tugas ini membuat build tetap ringan: build hanya membaca field State dan menyusun widget, initState menyiapkan, dan dispose membersihkan.

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 3

Kartu ini tampil, lalu tombolnya diketuk lima kali. Berapa kali initState tercetak di konsol?

class _KartuStokState extends State<KartuStok> {
  int _terjual = 0;

  @override
  void initState() {
    super.initState();
    print('initState');
  }

  @override
  Widget build(BuildContext context) {
    print('build');
    return ElevatedButton(
      onPressed: () => setState(() => _terjual++),
      child: Text('Terjual: $_terjual'),
    );
  }
}
Pilih satu jawaban

Latihan 2 dari 3

Tombol plus diketuk dua kali, dan tidak ada hal lain yang membangun ulang widget ini. Apa yang terlihat?

class _KeranjangState extends State<Keranjang> {
  int _jumlah = 0;

  void _tambah() {
    _jumlah++;
  }

  @override
  Widget build(BuildContext context) {
    return Row(children: [
      Text('Isi keranjang: $_jumlah'),
      IconButton(icon: const Icon(Icons.add), onPressed: _tambah),
    ]);
  }
}
Pilih satu jawaban

Latihan 3 dari 3

Layar pencarian memakai sebuah TextEditingController dan sebuah Timer milik State-nya. Di mana keduanya dibersihkan dengan dispose() dan cancel()?

Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Lanjutkan ke