Hari 16: StatefulWidget & State Management Dasar
60 min
Last updated 09 Apr 2026
StatefulWidget
Berbeda dengan StatelessWidget, StatefulWidget memiliki State yang bisa berubah. Ketika state berubah (via setState()), Flutter akan me-rebuild UI.
import "package:flutter/material.dart";
class Counter extends StatefulWidget {
const Counter({super.key});
@override State createState() => _CounterState();
}
class _CounterState extends State {
int _count = 0;
void _increment() => setState(() => _count++);
void _decrement() => setState(() => _count--);
void _reset() => setState(() => _count = 0);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Counter App")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Count: $_count", style: TextStyle(fontSize: 48)),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(onPressed: _decrement, child: Icon(Icons.remove)),
SizedBox(width: 20),
ElevatedButton(onPressed: _reset, child: Text("Reset")),
SizedBox(width: 20),
ElevatedButton(onPressed: _increment, child: Icon(Icons.add)),
],
),
],
),
),
);
}
}
void main() => runApp(MaterialApp(home: Counter()));
Lifecycle StatefulWidget
class MyWidget extends StatefulWidget {
const MyWidget({super.key});
@override State createState() => _MyWidgetState();
}
class _MyWidgetState extends State {
@override
void initState() {
super.initState();
print("initState — widget dibuat pertama kali");
// Tempat: inisialisasi data, setup listener, HTTP call pertama
}
@override
void dispose() {
print("dispose — widget dihapus dari tree");
// Tempat: cleanup controller, cancel subscription
super.dispose();
}
@override
Widget build(BuildContext context) => Container();
}
💡
Notice: Di Flutter nyata, setState(() {}) memicu rebuild Widget. Di sini kita simulasikan dengan pemanggilan build().
Assignment
Simulasikan StatefulWidget dengan TodoState yang bisa add dan remove item.
Expected output:
=== Todo List ===
1. Belajar Flutter
=== Todo List ===
1. Belajar Flutter
2. Buat project
=== Todo List ===
1. Belajar Flutter
2. Buat project
3. Push ke GitHub
--- Hapus item ke-2 ---
=== Todo List ===
1. Belajar Flutter
2. Push ke GitHub
Dart
main.dart
Solution
Output