Proyek: Todo CLI
Tugas proyek: aplikasi todo command-line dengan class dan collection.
Misi pamungkas: Todo CLI
Proyek terakhir track Dart, dan yang paling mirip aplikasi nyata. Kamu membangun aplikasi todo command-line: tambah tugas, tandai selesai, hapus, dan lihat statistik. Pola di sini (model + manager + perintah) adalah miniatur pola yang dipakai aplikasi Flutter profesional.
Kenapa proyek ini pamungkas? Karena ia menguji desain class: memisahkan data (Todo) dari pengelola (TodoApp), menangani id, dan memakai collection method (where) untuk statistik.
Spesifikasi
- Class Todo: field
id(int),judul(String),selesai(bool, default false). Methodtoggle()membalik status. MethodtoString()mencetak format[x] 1. Bayar listrikatau[ ] 2. Beli susu. - Class TodoApp: field
daftarbertipeList<Todo>dan:tambah(String judul): buat Todo dengan id otomatis increment (1, 2, 3...).hapus(int id): hapus berdasarkan id. Jika id tidak ada, cetak pesan, jangan crash (waspadaiRangeError!).toggle(int id): balik status todo. Tangani id yang tidak ada.tampilkan({bool? hanyaAktif}): cetak daftar rapi. Parameter named opsional: jikahanyaAktif == true, hanya tampilkan yang belum selesai.
- Simulasi perintah via list string:
['tambah Beli susu', 'tambah Bayar listrik', 'toggle 1', 'tampil', 'hapus 2', 'tampil', 'tampil aktif', 'keluar']. - Statistik akhir: total, selesai, aktif. Hitung dengan
where+length, bukan loop manual.
Contoh output yang diharapkan:
[ ] 1. Beli susu
[ ] 2. Bayar listrik
[x] 1. Beli susu
[ ] 2. Bayar listrik
Total: 2, Selesai: 1, Aktif: 1
Strategi pengerjaan
- Class Todo dulu: field, constructor,
toggle(),toString(). Uji dengan 2 objek manual. - TodoApp.tambah + tampilkan: pastikan id increment dan tampilan rapi.
- hapus + toggle: cari todo by id. Ingat challenge pemanasan: loop dan kembalikan null jika tidak ketemu. Jangan pakai index list sebagai id!
- Parser perintah:
tambah <judul>(judul bisa multi-kata: gabungkan sisa split denganjoin(' ')),toggle <id>,hapus <id>,tampil/tampil aktif. - Statistik:
daftar.where((t) => t.selesai).length.
// Kerangka awal
class Todo {
int id;
String judul;
bool selesai = false;
Todo(this.id, this.judul);
void toggle() => selesai = !selesai;
@override
String toString() => '[${selesai ? 'x' : ' '}] $id. $judul';
}
class TodoApp {
List<Todo> daftar = [];
int _idBerikutnya = 1;
void tambah(String judul) {
daftar.add(Todo(_idBerikutnya++, judul));
}
// TODO: hapus, toggle, tampilkan, statistik
}
void main() {
var app = TodoApp();
// TODO: simulasi perintah
}Perhatikan _idBerikutnya: id disimpan terpisah dari index list, sehingga hapus item tidak merusak id item lain. Ini detail desain yang membedakan pemula dari yang berpikir seperti engineer.
Jebakan yang harus dihindari
- Pakai index list sebagai id: setelah hapus item tengah, semua id bergeser. Pakai counter terpisah.
- firstWhere tanpa orElse untuk cari id: crash jika tidak ketemu. Pakai loop manual atau
orElse. - Lupa menangani perintah rusak:
'toggle'tanpa angka,'tambah'tanpa judul. Validasi dulu, eksekusi kemudian.
Catatan teknis: Fokus pada desain class yang bersih dan penanganan id yang tidak ada. Proyek ini mensimulasikan pola state management sederhana yang akan sering kamu temui di Flutter: satu sumber data (daftar), method untuk mengubahnya, dan UI (tampilkan) yang membaca.
Kriteria penilaian
AI tutor menilai: class Todo & TodoApp benar (toggle, toString, id otomatis), hapus/toggle aman untuk id tak ada, parameter named opsional hanyaAktif dipakai, statistik benar via where, dan tidak ada crash untuk semua perintah contoh.
Tantangan
Pemanasan: cari by id
Buat fungsi cariTodo(List<Map<String, dynamic>> daftar, int id) yang mengembalikan Map todo atau null jika tidak ketemu (pakai loop, jangan pakai firstWhere tanpa orElse).
// TODO
void main() {
var daftar = [
{'id': 1, 'judul': 'A'},
{'id': 2, 'judul': 'B'},
];
// TODO: uji cari id 2 dan id 99
}Tugas
Tugas: Todo CLI
Bangun aplikasi todo CLI lengkap sesuai misi: class Todo & TodoApp, id otomatis, tambah/hapus/toggle/tampilkan dengan penanganan id tak ada, dan statistik akhir. Tulis dari NOL.
Kriteria penilaian:
- Class Todo dengan toggle() benar
- ID otomatis increment
- hapus/toggle aman untuk id yang tidak ada
- Parameter named optional hanyaBelumSelesai dipakai
- Statistik total/selesai/aktif benar
AI tutor akan memeriksa bug, kesalahan syntax, dan memberi saran perbaikan.
Kuis Bab
Uji pemahamanmu: Bab 6: Ekosistem & Proyek
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Blok mana dalam try-catch yang SELALU dijalankan, apapun yang terjadi?
2.Keyword apa yang dipakai untuk melempar exception di Dart?
3.Perintah apa untuk menambah package dari pub.dev ke project Dart?
4.Diberikan import 'matematika.dart' as m;, bagaimana cara memanggil fungsi tambah dari library itu?
5.Dalam proyek kalkulator CLI, struktur data apa yang dipakai untuk menyimpan riwayat operasi?