📚 MODUL AJAR FLUTTER
"Aplikasi Biodata Siswa" — Fokus Form, Validasi & Layout
📋 IDENTITAS MODUL
| Item | Keterangan |
|---|---|
| Mata Pelajaran | Pemrograman Mobile (Flutter) |
| Kelas / Semester | XI PPLG / Ganjil |
| Alokasi Waktu | 14 JP (3 x pertemuan @ 1 pekan jadwal Blok) |
| Materi Pokok | Form, Validasi, Navigasi & Layout Lanjutan |
| Model Pembelajaran | Project Based Learning (PjBL) + Pair Programming |
🎯 TUJUAN PEMBELAJARAN
Setelah mengikuti praktikum ini, peserta didik mampu:
Kognitif (C2-C3)
Menjelaskan fungsi
Form,GlobalKey<FormState>, danTextFormFieldMengidentifikasi jenis-jenis validator pada form Flutter
Menjelaskan alur navigasi antar halaman (
Navigator.push&Navigator.pop)
Psikomotorik (C4-C6)
Membuat form input biodata dengan validasi lengkap
Mengimplementasikan
showDatePickeruntuk input tanggalMenampilkan data ke
ListViewmenggunakanCarddanListTileMenerapkan
Hero animationpada transisi antar halamanMembuat fitur edit & hapus data
Afektif
Menumbuhkan ketelitian dalam validasi input
Mengembangkan inisiatif dengan menambah fitur kreatif
Berpikir kritis dalam menyelesaikan error (debugging)
🧩 CAPAIAN PEMBELAJARAN (CP)
Peserta didik mampu mengembangkan aplikasi mobile sederhana menggunakan framework Flutter dengan menerapkan konsep widget, state management, form handling, dan navigasi antar halaman sesuai kebutuhan pengguna.
📦 FITUR YANG HARUS DIBUAT
✅ Fitur Wajib
| No | Fitur | Widget/Konsep |
|---|---|---|
| 1 | Form input biodata (Nama, NIS, Kelas, Alamat, Tanggal Lahir, Jenis Kelamin) | Form, TextFormField, Radio |
| 2 | Validasi tiap field | validator, GlobalKey<FormState> |
| 3 | Date picker untuk tanggal lahir | showDatePicker |
| 4 | Foto profil dengan Image.network + placeholder | CircleAvatar, ClipOval |
| 5 | Simpan ke List → tampil di ListView | ListView.builder, Card, ListTile |
| 6 | Tap item → Detail Page | Navigator.push, Hero |
| 7 | Edit & Hapus data | showDialog, setState |
⭐ Fitur Nilai Tambahan (pilih minimal 1)
🔍 Search / filter berdasarkan nama
🎨 Dark mode toggle
📊 Counter jumlah siswa
🖼️ Ambil foto dari kamera (
image_picker)💾 Simpan data ke
shared_preferences🎬 Animasi transisi custom
🗂️ STRUKTUR PROJECT
biodata_siswa/ ├── lib/ │ ├── main.dart │ ├── models/ │ │ └── siswa.dart │ ├── pages/ │ │ ├── form_page.dart │ │ ├── list_page.dart │ │ └── detail_page.dart │ └── widgets/ │ └── custom_textfield.dart └── pubspec.yaml
🚀 STARTER CODE
⚠️ Catatan Kode Starter : Starter code ini sebagai awal / codingan dasar. Siswa wajib mengembangkan per-bagian secara mandiri.
📄 1. lib/models/siswa.dart
class Siswa { String nama; String nis; String kelas; String alamat; DateTime tanggalLahir; String jenisKelamin; String? fotoUrl; Siswa({ required this.nama, required this.nis, required this.kelas, required this.alamat, required this.tanggalLahir, required this.jenisKelamin, this.fotoUrl, }); }
📄 2. lib/main.dart
import 'package:flutter/material.dart'; import 'pages/list_page.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); Widget build(BuildContext context) { return MaterialApp( title: 'Biodata Siswa', theme: ThemeData( primarySwatch: Colors.indigo, useMaterial3: true, ), home: const ListPage(), ); } }
📄 3. lib/pages/list_page.dart (Starter)
import 'package:flutter/material.dart'; import '../models/siswa.dart'; import 'form_page.dart'; import 'detail_page.dart'; class ListPage extends StatefulWidget { const ListPage({super.key}); State<ListPage> createState() => _ListPageState(); } class _ListPageState extends State<ListPage> { // TODO 1: Buat List<Siswa> kosong untuk menampung data Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Daftar Biodata Siswa')), body: /* TODO 2: Tampilkan ListView.builder - Jika list kosong, tampilkan ikon + tulisan "Belum ada data" - Jika ada data, tampilkan Card + ListTile */ const Center(child: Text('Belum ada data')), floatingActionButton: FloatingActionButton( child: const Icon(Icons.add), onPressed: () async { // TODO 3: Navigasi ke FormPage dan tunggu hasilnya // Jika hasil != null, tambahkan ke list dan setState }, ), ); } }
📄 4. lib/pages/form_page.dart (Starter)
import 'package:flutter/material.dart'; import '../models/siswa.dart'; class FormPage extends StatefulWidget { final Siswa? siswaEdit; // null = tambah baru, != null = edit const FormPage({super.key, this.siswaEdit}); State<FormPage> createState() => _FormPageState(); } class _FormPageState extends State<FormPage> { final _formKey = GlobalKey<FormState>(); // TODO 1: Buat TextEditingController untuk nama, nis, kelas, alamat // TODO 2: Buat variabel DateTime? _tanggalLahir // TODO 3: Buat variabel String _jenisKelamin = 'Laki-laki' void initState() { super.initState(); // TODO 4: Jika widget.siswaEdit != null, isi controller dengan data lama } void dispose() { // TODO 5: Dispose semua controller super.dispose(); } Future<void> _pilihTanggal() async { // TODO 6: Gunakan showDatePicker // Hint: firstDate: DateTime(2000), lastDate: DateTime.now() } void _simpan() { // TODO 7: Validasi form dengan _formKey.currentState!.validate() // Jika valid, buat objek Siswa baru // Kembalikan ke halaman sebelumnya dengan Navigator.pop(context, siswa) } Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.siswaEdit == null ? 'Tambah Biodata' : 'Edit Biodata'), ), body: Form( key: _formKey, child: ListView( padding: const EdgeInsets.all(16), children: [ // TODO 8: TextFormField Nama (validator: tidak boleh kosong) // TODO 9: TextFormField NIS (validator: min 4 digit, angka) // TODO 10: TextFormField Kelas // TODO 11: TextFormField Alamat (maxLines: 3) // TODO 12: Field Tanggal Lahir → InkWell + showDatePicker // TODO 13: Radio button Jenis Kelamin // TODO 14: Tombol Simpan ], ), ), ); } }
📄 5. lib/pages/detail_page.dart (Starter)
import 'package:flutter/material.dart'; import '../models/siswa.dart'; class DetailPage extends StatelessWidget { final Siswa siswa; const DetailPage({super.key, required this.siswa}); Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Detail Siswa')), body: SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( children: [ // TODO 1: Hero animation untuk foto profil // Hint: Hero(tag: siswa.nis, child: CircleAvatar(...)) // TODO 2: Card berisi info lengkap siswa menggunakan ListTile // TODO 3: Format tanggal dengan intl (dd MMMM yyyy) ], ), ), ); } }
✅ CHECKLIST FITUR (Centang Sendiri)
Tandai / centang fitur yang sudah dikerjakan.
🟩 Fitur Wajib
- □
Halaman list menampilkan data dari
List<Siswa> - □
Halaman list menampilkan pesan "Belum ada data" saat kosong
- □
Form memiliki 4
TextFormField(nama, NIS, kelas, alamat) - □
Validator nama: tidak boleh kosong
- □
Validator NIS: minimal 4 karakter, hanya angka
- □
Validator kelas: tidak boleh kosong
- □
Validator alamat: minimal 5 karakter
- □
Field tanggal lahir menggunakan
showDatePicker - □
Radio button jenis kelamin (Laki-laki / Perempuan)
- □
Tombol Simpan memvalidasi form sebelum menyimpan
- □
Data baru muncul di
ListViewsetelah disimpan - □
Tap item → navigasi ke Detail Page
- □
Detail Page menampilkan foto + semua field biodata
- □
Tombol Edit → membuka Form dengan data terisi
- □
Tombol Hapus → konfirmasi dengan
AlertDialog - □
Hapus → data hilang dari list
- □
Foto profil menggunakan
Image.network+ placeholder - □
Menggunakan
CarddanListTiledi list - □
Menggunakan
Hero animationdi foto profil
⭐ Fitur Nilai Tambahan (pilih minimal 1)
- □
Search/filter berdasarkan nama
- □
Dark mode toggle
- □
Counter jumlah siswa di AppBar
- □
Ambil foto dari kamera (
image_picker) - □
Simpan data ke
shared_preferences - □
Animasi transisi custom
🎓 PANDUAN CODE REVIEW (10 Menit Akhir)
Persiapkan jawaban terbaik untuk 3 pertanyaan acak:
"Coba jelaskan apa fungsi
GlobalKey<FormState>di kodemu?""Kenapa
TextEditingControllerharus di-dispose?""Apa bedanya
Navigator.pushdanNavigator.pop?""Bagaimana caramu menampilkan data dari Form ke ListView?"
"Apa fungsi
setStatedi tombol hapus?"
Penilaian sikap: siswa yang bisa menjawab = bonus poin partisipasi.
📝 TUGAS PENGUMPULAN
📌 Format Artikel Blog (Wajib)
Judul: Praktikum Flutter — Aplikasi Biodata Siswa 1. Identitas Nama : ................ Kelas : ................ 2. Tujuan Praktikum (tulis 3-5 poin tujuan sesuai modul) 3. Screenshot Aplikasi - Halaman Form Kosong - Halaman Form Terisi - Halaman List Biodata - Halaman Detail - Screenshot saat terjadi ERROR (WAJIB ADA!) - Screenshot setelah error teratasi 4. Penjelasan Kode - Jelaskan fungsi Form & GlobalKey - Jelaskan cara kerja validator - Jelaskan alur navigasi - Jelaskan fungsi Hero animation 5. Kendala & Solusi (ceritakan minimal 1 error yang kamu alami + cara mengatasinya) 6. Fitur Kreatif yang Ditambahkan (jelaskan fitur tambahan yang kamu buat) 7. Kesimpulan (apa yang kamu pelajari dari praktikum ini)
📤 Format Kirim ke Kometar Postingan ini
Nama : Kelas : Link Blog : https://... Fitur Kreatif : (sebutkan) Status : ✅ Selesai
🚫 KEBIJAKAN PENGGUNAAN AI
PENTING DIBACA SISWA!
✅ Boleh: Bertanya ke AI tentang konsep, error handling, atau penjelasan widget.
✅ Boleh: Minta AI menjelaskan kode yang sudah kamu tulis sendiri.
❌ Dilarang: Copy-paste 100% kode dari AI.
❌ Dilarang: Submit tanpa memahami kode.
📸 Wajib: Sertakan screenshot proses error + solusinya di blog. Ini bukti kamu benar-benar mengerjakan.
Sanksi: Jika terbukti copy-paste dan tidak bisa menjelaskan saat code review → nilai dianggap 0 dan wajib remedial.
📊 RUBRIK PENILAIAN
| Aspek | Bobot | Kriteria |
|---|---|---|
| Kelengkapan Fitur Wajib | 40% | Semua ✅ checklist terpenuhi |
| Validasi Form | 15% | Validator berjalan & pesan error jelas |
| UI/UX & Layout | 15% | Rapi, konsisten, menggunakan Card/ListTile |
| Navigasi & Hero | 10% | Perpindahan halaman halus, Hero berfungsi |
| Artikel Blog | 10% | Lengkap, ada screenshot error & penjelasan |
| Fitur Kreatif | 5% | Ada fitur tambahan original |
| Code Review | 5% | Bisa menjelaskan kode sendiri |
Nilai Akhir = Total Skor (maks 100)
🧠 REFERENSI BELAJAR
🎥 YouTube: "Flutter Form Validation Tutorial"







Komentar ini telah dihapus oleh pengarang.
BalasHapusNama: Denia Ega Iswandari
BalasHapusKelas: XI RPL 1
Link Blog: https://catatanrpldenia24.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Status: ✅Selesai
Komentar ini telah dihapus oleh pengarang.
BalasHapusKomentar ini telah dihapus oleh pengarang.
HapusNama : Anjani Repalianti
HapusKelas : XI RPL 1
Link Blog: https://tugasanjani.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Status: ✅ Selesai
Nama : Toni handoyo
BalasHapusKelas : XI RPL 1
Link Blog: https://toni2972929.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Status: ✅ Selesai
Nama: Sansan Susanti
BalasHapusKelas: XI RPL 1
Link Blog: https://belajarteknologisansan.blogspot.com/2026/10/membuat-biodata-siswa_0419465562.html
Status: ✅ Selesai
Komentar ini telah dihapus oleh pengarang.
BalasHapusKomentar ini telah dihapus oleh pengarang.
BalasHapusNama : Sheva Ghibran Maulana
BalasHapusKelas : XI RPL 1
Link : https://sheva-xl-pplg-1.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html
Status:✅Selesai
Nama: Cika Pebrianti
BalasHapusKelas: XI RPL 1
Link:
https://cikapebriantibelajar.blogspot.com/2026/10/aplikasi-biodata-siswa-menggunakan.html
Status:✅ selesai
Nama: M.arfan alfaridzi
BalasHapusKelas : XI RPL 1
Link:
https://teknologiarfann.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html
Status:✅ selesai
Nama: Dian Najma Gusana
BalasHapusKelas: XI RPL 1
Link: https://dnajma19.blogspot.com/2026/10/praktikum-flutter-membuat-aplikasi.html
Status: ✔️ selesai
Nama: M.Fachri Alam
BalasHapusKelas: XI RPL 1
Link: https://tugas-fachri-xi.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Status: ✅ selesai
Nama: Didik Fahriadi
BalasHapusKelas: XI RPL 1
Link:
https://didikfahriadi1945.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Stasus:✅ Selesai
Komentar ini telah dihapus oleh pengarang.
BalasHapusNama : Noval Tirta Aditya
BalasHapusKelas : XI RPL 1
Link : https://noval-flutter-xi.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Stasus:✅ Selesai
Nama: Rafid
BalasHapusKelas: XI Rpl 1
Link:https://tugas-pplg-rafid.blogspot.com/2026/10/aplikasi-biodata-siswa.html
Status:✅ Selesai
Nama: Resih
BalasHapusKelas: XI RPL 1
Link Blog:https://belajar-bersama-resih.blogspot.com/2026/10/laporan-praktikum-flutter-membangun.html
Status:✅ Selesai
https://tugasilhamrahmanh.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html
BalasHapus