"Aplikasi Biodata Siswa" — Fokus Form, Validasi & Layout

 

📚 MODUL AJAR FLUTTER

"Aplikasi Biodata Siswa" — Fokus Form, Validasi & Layout


📋 IDENTITAS MODUL

ItemKeterangan
Mata PelajaranPemrograman Mobile (Flutter)
Kelas / SemesterXI PPLG / Ganjil
Alokasi Waktu14 JP (3 x pertemuan @ 1 pekan jadwal Blok)
Materi PokokForm, Validasi, Navigasi & Layout Lanjutan
Model PembelajaranProject Based Learning (PjBL) + Pair Programming

🎯 TUJUAN PEMBELAJARAN

Setelah mengikuti praktikum ini, peserta didik mampu:

  1. Kognitif (C2-C3)

    • Menjelaskan fungsi Form, GlobalKey<FormState>, dan TextFormField

    • Mengidentifikasi jenis-jenis validator pada form Flutter

    • Menjelaskan alur navigasi antar halaman (Navigator.push & Navigator.pop)

  2. Psikomotorik (C4-C6)

    • Membuat form input biodata dengan validasi lengkap

    • Mengimplementasikan showDatePicker untuk input tanggal

    • Menampilkan data ke ListView menggunakan Card dan ListTile

    • Menerapkan Hero animation pada transisi antar halaman

    • Membuat fitur edit & hapus data

  3. 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

NoFiturWidget/Konsep
1Form input biodata (Nama, NIS, Kelas, Alamat, Tanggal Lahir, Jenis Kelamin)Form, TextFormField, Radio
2Validasi tiap fieldvalidator, GlobalKey<FormState>
3Date picker untuk tanggal lahirshowDatePicker
4Foto profil dengan Image.network + placeholderCircleAvatar, ClipOval
5Simpan ke List → tampil di ListViewListView.builder, Card, ListTile
6Tap item → Detail PageNavigator.push, Hero
7Edit & Hapus datashowDialog, 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

text
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

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

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)

dart
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)

dart
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)

dart
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 ListView setelah 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 Card dan ListTile di list

  • □

    Menggunakan Hero animation di 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:

  1. "Coba jelaskan apa fungsi GlobalKey<FormState> di kodemu?"

  2. "Kenapa TextEditingController harus di-dispose?"

  3. "Apa bedanya Navigator.push dan Navigator.pop?"

  4. "Bagaimana caramu menampilkan data dari Form ke ListView?"

  5. "Apa fungsi setState di tombol hapus?"

Penilaian sikap: siswa yang bisa menjawab = bonus poin partisipasi.


📝 TUGAS PENGUMPULAN

📌 Format Artikel Blog (Wajib)

text
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

text
Nama    :
Kelas   :
Link Blog : https://...
Fitur Kreatif : (sebutkan)
Status  : ✅ Selesai

🚫 KEBIJAKAN PENGGUNAAN AI

PENTING DIBACA SISWA!

  1. ✅ Boleh: Bertanya ke AI tentang konsep, error handling, atau penjelasan widget.

  2. ✅ Boleh: Minta AI menjelaskan kode yang sudah kamu tulis sendiri.

  3. ❌ Dilarang: Copy-paste 100% kode dari AI.

  4. ❌ Dilarang: Submit tanpa memahami kode.

  5. 📸 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

AspekBobotKriteria
Kelengkapan Fitur Wajib40%Semua ✅ checklist terpenuhi
Validasi Form15%Validator berjalan & pesan error jelas
UI/UX & Layout15%Rapi, konsisten, menggunakan Card/ListTile
Navigasi & Hero10%Perpindahan halaman halus, Hero berfungsi
Artikel Blog10%Lengkap, ada screenshot error & penjelasan
Fitur Kreatif5%Ada fitur tambahan original
Code Review5%Bisa menjelaskan kode sendiri

Nilai Akhir = Total Skor (maks 100)


🧠 REFERENSI BELAJAR


Salam: Redaksi

Share:

20 komentar:

  1. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  2. Nama: Denia Ega Iswandari
    Kelas: XI RPL 1
    Link Blog: https://catatanrpldenia24.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Status: ✅Selesai

    BalasHapus
  3. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
    Balasan
    1. Komentar ini telah dihapus oleh pengarang.

      Hapus
    2. Nama : Anjani Repalianti
      Kelas : XI RPL 1
      Link Blog: https://tugasanjani.blogspot.com/2026/10/aplikasi-biodata-siswa.html
      Status: ✅ Selesai

      Hapus
  4. Nama : Toni handoyo
    Kelas : XI RPL 1
    Link Blog: https://toni2972929.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Status: ✅ Selesai

    BalasHapus
  5. Nama: Sansan Susanti
    Kelas: XI RPL 1
    Link Blog: https://belajarteknologisansan.blogspot.com/2026/10/membuat-biodata-siswa_0419465562.html
    Status: ✅ Selesai

    BalasHapus
  6. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  7. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  8. Nama : Sheva Ghibran Maulana
    Kelas : XI RPL 1
    Link : https://sheva-xl-pplg-1.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html
    Status:✅Selesai

    BalasHapus
  9. Nama: Cika Pebrianti
    Kelas: XI RPL 1
    Link:
    https://cikapebriantibelajar.blogspot.com/2026/10/aplikasi-biodata-siswa-menggunakan.html

    Status:✅ selesai

    BalasHapus
  10. Nama: M.arfan alfaridzi
    Kelas : XI RPL 1
    Link:
    https://teknologiarfann.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html
    Status:✅ selesai

    BalasHapus
  11. Nama: Dian Najma Gusana
    Kelas: XI RPL 1
    Link: https://dnajma19.blogspot.com/2026/10/praktikum-flutter-membuat-aplikasi.html
    Status: ✔️ selesai

    BalasHapus
  12. Nama: M.Fachri Alam
    Kelas: XI RPL 1
    Link: https://tugas-fachri-xi.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Status: ✅ selesai

    BalasHapus
  13. Nama: Didik Fahriadi
    Kelas: XI RPL 1
    Link:
    https://didikfahriadi1945.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Stasus:✅ Selesai

    BalasHapus
  14. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  15. Nama : Noval Tirta Aditya
    Kelas : XI RPL 1
    Link : https://noval-flutter-xi.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Stasus:✅ Selesai

    BalasHapus
  16. Nama: Rafid
    Kelas: XI Rpl 1
    Link:https://tugas-pplg-rafid.blogspot.com/2026/10/aplikasi-biodata-siswa.html
    Status:✅ Selesai

    BalasHapus
  17. Nama: Resih
    Kelas: XI RPL 1
    Link Blog:https://belajar-bersama-resih.blogspot.com/2026/10/laporan-praktikum-flutter-membangun.html
    Status:✅ Selesai

    BalasHapus
  18. https://tugasilhamrahmanh.blogspot.com/2026/10/membuat-aplikasi-biodata-siswa.html

    BalasHapus

Categories

Blogger Tricks

Blogger Themes