Practicum Archive

Laporan Praktikum & Project

Kumpulan laporan praktikum berdasarkan mata kulia beserta projek kecil yang saya buat. Pilih kategori mata kuliah, lalu buka detail laporan untuk membaca pendahuluan, tujuan, tools, hasil, dan dokumentasi pendukung.

13 Laporan awal
01
Pemrograman Web

Praktikum Laravel: Routing, View, dan Controller

Pengenalan struktur Laravel, konsep MVC, routing dasar, dan pembuatan halaman sederhana.

Laravel MVC PHP
02
Pemrograman Web

Praktikum Laravel: Migration, Seeding, Routing, Model, Controller, dan View

Pembahasan lanjutan Laravel tentang pengelolaan database, alur data, dan penyusunan fitur berbasis MVC.

Laravel Migration Seeding
03
Pemrograman Web

Praktikum Laravel Relationship

Pembahasan relasi database Laravel, migration, model relationship, seeder, controller, view, dan query Eloquent.

Laravel Relationship Eloquent
04
Pemrograman Web

Laravel UI Bootstrap dan Templating

Penerapan Laravel UI dengan Bootstrap untuk autentikasi dan templating halaman web.

Laravel Bootstrap UI Auth
05
OOP

Praktikum Java GUI: Aplikasi Presensi Piket

Penerapan class, object, event handling, tabel data, dan operasi CRUD pada aplikasi desktop.

Java Swing CRUD
06
Projek

DocuTemplate

Aplikasi generator template dokumen otomatis untuk kebutuhan administrasi dan laporan.

Web Automation Template
07
Projek

Google Auto-Login: Multi-Akun Berurutan

Skrip Python + Playwright untuk login otomatis ke banyak akun Google secara berurutan, lengkap dengan launcher satu klik.

Python Playwright Automation
08
Projek

GForm Automator: Auto Google Form Filler

Otomasi pengisian Google Form dengan Stealth Mode dan Headless Browser menggunakan Playwright untuk bypass bot detection.

Node.js Playwright Automation
09
Projek

FileHunt: Web-Based File Search System

Sistem pencarian file berbasis web yang membantu pengguna menemukan file dengan fitur verifikasi link, multiple search modes (Academic, Dataset, Official), dan dukungan berbagai tipe file.

Python React FastAPI
10
Aplikasi Mobile

Flutter Form Validation: TextField & TextFormField

Pengenalan widget input TextField dan TextFormField di Flutter dengan implementasi validasi form, TextEditingController, GlobalKey, dan lifecycle management.

Flutter Dart Mobile Dev
11
Aplikasi Mobile

Flutter Widget Dasar: StatelessWidget & StatefulWidget

Implementasi konsep dasar widget Flutter melalui pembuatan aplikasi info saldo dengan fitur toggle visibility menggunakan StatelessWidget untuk komponen statis dan StatefulWidget untuk komponen interaktif.

Flutter Dart Mobile Dev
12
Aplikasi Mobile

Flutter Layouting: Row, Column, Container & ListTile

Implementasi widget layouting Flutter melalui pembuatan halaman dashboard Expense Tracker dengan integrasi widget Row, Column, Container, ListTile, dan SingleChildScrollView agar halaman terstruktur dan bisa di-scroll.

Flutter Dart Mobile Dev
13
Aplikasi Mobile

Flutter Input Widgets dan Forms: Expense Tracker

Implementasi input widgets dan forms di Flutter untuk aplikasi pencatat transaksi keuangan. Menggunakan TextFormField, DropdownButtonFormField, showDatePicker, dan validasi input dengan GlobalKey.

Flutter Dart Forms
14
Aplikasi Mobile

Flutter Navigation & Passing Data: Expense Tracker Multi-Screen

Implementasi navigasi antarhalaman menggunakan Navigator.push dan Navigator.pop dengan konsep stack, serta passing data melalui constructor pada aplikasi Expense Tracker yang terdiri dari dashboard, form transaksi, dan halaman detail.

Flutter Dart Navigation
Pilih salah satu laporan

Tekan tombol Baca Laporan pada card untuk membuka detail praktikum.

Pemrograman Web

Laravel UI Bootstrap dan Templating

Ringkasan laporan praktikum tentang penerapan Laravel UI dengan Bootstrap untuk autentikasi, integrasi template SB Admin 2, dan manajemen pengguna berbasis CRUD.

  1. Pendahuluan

    Laravel merupakan salah satu framework PHP yang banyak digunakan untuk mengembangkan aplikasi web secara cepat, terstruktur, efisien, dan modern. Laravel menerapkan arsitektur MVC (Model-View-Controller) sebagai proses pengelolaan data, logika aplikasi, dan tampilan pengguna. Selain itu, Laravel adalah framework berbasis package yang mendukung proses pengembangan, termasuk fitur autentikasi secara otomatis.

    Pada praktikum ini, mahasiswa mempelajari pengelolaan halaman data autentikasi (login dan register) yang dibangun menggunakan package Laravel UI berbasis framework CSS Bootstrap. Selain itu dilakukan juga proses pengelolaan tabel database melalui penggunaan fitur migration untuk membentuk struktur tabel dan admin default secara otomatis.

    Selain pengelolaan basis data dan autentikasi, fokus utama lainnya dalam praktikum ini adalah templating atau penyusunan tata letak (layout) aplikasi. Mahasiswa mempelajari penggunaan template eksternal, yaitu SB Admin 2, ke dalam project Laravel untuk membangun antarmuka komponen halaman web menjadi bagian-bagian kecil seperti sidebar, topbar, dan konten utama agar kode lebih modular dan mudah dikelola.

    Di akhir praktikum, mahasiswa mengimplementasikan konsep CRUD (Create, Read, Update, Delete) pada pengelolaan pengguna (users). Implementasi ini memanfaatkan Resource Controller dan diperkaya dengan penggunaan plugin DataTables pada bagian view untuk mempermudah proses pencarian (search) dan paginasi (pagination) data. Dengan pendekatan ini, mahasiswa mendapatkan gambaran yang menyeluruh mengenai pengelolaan dan pembangunan fitur web.

  2. Tujuan

    • Mahasiswa mampu mengimplementasikan sistem autentikasi pengguna (login dan register) serta pengelolaan basis data menggunakan migration dan seeding pada framework Laravel.
    • Mahasiswa mampu mengimplementasikan template desain eksternal (SB Admin 2) ke dalam project Laravel dengan pendekatan templating yang modular dan responsif.
    • Mahasiswa mampu membangun fitur manajemen pengguna (user management) dengan menerapkan konsep CRUD (Create, Read, Update, Delete) melalui Resource Controller dan plugin DataTables.
  3. Alat atau Tools yang Dipakai

    • Laragon / XAMPP
    • Visual Studio Code
    • Composer
    • Git
    • Node JS
    • NPM
    • GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses pembuatan sistem akademik sederhana menggunakan Laravel Full-stack MVC. Tahapan pengerjaan dimulai dari pembuatan project, database, migration, model, controller, pembuatan route, blade template, view untuk mengelola dan menampilkan data pengguna.

    4.1 Membuat Project Laravel

    Pada tahap ini, dilakukan pembuatan project, konfigurasi environment, dan logika sistem.

    4.2 Pembuatan Project dan Konfigurasi Database

    Langkah pertama adalah membuat project Laravel. Setelah project berhasil dibuat, jalankan perintah npm install dan npm run build untuk menginstal dependensi frontend dan membangun aset.

    Terminal menjalankan npm install dan npm run build pada project Laravel
    Proses instalasi dependensi frontend menggunakan npm install dan npm run build.

    Setelah project selesai, dilakukan konfigurasi database pada file .env. Hal ini bertujuan agar aplikasi dapat terkoneksi ke database MySQL yang telah dibuat melalui interface (phpMyAdmin).

    Konfigurasi database pada file env Laravel
    Konfigurasi koneksi database pada file .env.
    4.2 Implementasi Autentikasi

    Untuk fitur login dan register, digunakan package laravel/ui dengan framework Bootstrap. Hal ini mempermudah proses scaffolding halaman autentikasi.

    Instalasi package laravel ui dan bootstrap auth melalui terminal
    Instalasi package laravel/ui dan scaffolding autentikasi Bootstrap menggunakan php artisan ui bootstrap --auth.

    Setelah berhasil, silakan buka halaman login dan register. Jika berhasil maka akan menampilkan seperti berikut.

    Halaman login Laravel UI Bootstrap
    Halaman login yang dihasilkan oleh Laravel UI Bootstrap.
    Halaman register Laravel UI Bootstrap
    Halaman register yang dihasilkan oleh Laravel UI Bootstrap.
    4.3 Kustomisasi Database dan Seeding

    Dilakukan penambahan kolom pada tabel users untuk mengakomodasi kebutuhan sistem informasi sekolah. Penambahan kolom username, level, dan nama dilakukan melalui migration baru.

    a. Custom Table Users

    Authentication Laravel secara otomatis akan menggunakan table Users yang berisi tentang informasi data user, berikut struktur table users. Dengan menggunakan perintah php artisan make:migration create_table_users, maka ada pada tabel pada database dengan struktur berikut.

    Struktur tabel users pada database
    Struktur tabel users pada database.

    Selanjutnya buka folder migration yang sudah di buat dan tulis kode berikut.

    Kode migration untuk kustomisasi tabel users
    File migration untuk kustomisasi struktur tabel users.

    b. Seeder untuk Admin

    Langkah selanjutnya setelah mengisikan tabel users adalah mengisi data pengguna melalui fitur seeding. Untuk menguji, buatlah seeder bernama AdminSeeder, dengan menggunakan perintah php artisan make:seeder AdminSeeder.

    Perintah membuat AdminSeeder melalui terminal
    Perintah untuk membuat file AdminSeeder.

    Setelah perintah dijalankan, file AdminSeeder.php pada folder database/seeders. Selanjutnya, silakan akses file tersebut dan masukkan kode berikut untuk menambahkan data administrator.

    Kode AdminSeeder untuk data administrator
    Kode AdminSeeder berisi data awal untuk akun administrator.

    Selanjutnya untuk menjalankan seeding dengan cara menggunakan perintah berikut: php artisan db:seed --class=AdminSeeder. Jika berhasil maka akan muncul seperti gambar berikut.

    Menjalankan seeder AdminSeeder melalui terminal
    Perintah php artisan db:seed --class=AdminSeeder berhasil dijalankan.
    4.4 Integrasi Template SB Admin 2

    Setelah autentikasi Laravel berhasil diimplementasikan untuk menampilkan dashboard, langkah selanjutnya adalah melakukan kustomisasi template aplikasi agar sesuai dengan desain yang diinginkan. Pada studi kasus ini, kami menggunakan template SB Admin 2 berbasis framework Bootstrap. Proses pengimplementasian dilakukan dengan mengunduh template dari situs resmi, mengekstrak berkas tersebut, kemudian membuat direktori baru bernama sb-admin di dalam folder public project Laravel untuk menyimpan seluruh aset template tersebut.

    a. Halaman Login Aplikasi

    Kode halaman login dengan template SB Admin 2
    Kode blade untuk halaman login menggunakan template SB Admin 2.
    Kode lanjutan halaman login SB Admin 2
    Kode lanjutan halaman login SB Admin 2.

    Maka output yang akan di hasilkan adalah sebagai berikut.

    Tampilan halaman login dengan template SB Admin 2
    Hasil tampilan halaman login menggunakan template SB Admin 2.

    b. Layout Global

    Tahap berikutnya adalah membuat layout global yang berfungsi sebagai kerangka utama bagi keseluruhan aplikasi. Mengingat file app.blade.php sudah digunakan untuk halaman autentikasi (login), maka diperlukan pembuatan layout alternatif. Oleh karena itu, dibuatlah file main.blade.php di dalam direktori views/layouts sebagai layout utama yang akan digunakan oleh seluruh halaman yang membutuhkan tampilan dashboard. Kode program untuk layout global adalah sebagai berikut.

    Kode file main blade php sebagai layout global
    File main.blade.php sebagai layout global aplikasi.

    c. Sidebar

    Buat file pada folder layouts dengan nama sidebar.blade.php dengan kode program berikut.

    Kode sidebar blade php bagian 1
    Kode sidebar.blade.php bagian pertama.
    Kode sidebar blade php bagian 2
    Kode sidebar.blade.php bagian kedua.

    d. Topbar

    Buat file pada folder layouts dengan nama topbar.blade.php dan isi dengan kode program berikut.

    Kode topbar blade php bagian 1
    Kode topbar.blade.php bagian pertama.
    Kode topbar blade php bagian 2
    Kode topbar.blade.php bagian kedua.

    e. Hasil Konfigurasi Template

    Jika konfigurasi berhasil maka tampilan nya akan menjadi seperti berikut ini.

    Tampilan dashboard dengan template SB Admin 2
    Hasil tampilan dashboard setelah integrasi template SB Admin 2 berhasil.
    4.5 Manajemen Users

    Tahap berikutnya adalah membangun fitur manajemen pengguna. Mengingat fitur ini menerapkan fungsi CRUD (Create, Read, Update, dan Delete) secara penuh, maka kita akan menggunakan Resource Controller. Langkah ini dilakukan melalui terminal dengan menjalankan perintah php artisan make:controller UserController --resource.

    Selanjutnya ini kode program berikut pada route web.

    Kode route resource untuk UserController pada file web php
    Penambahan route resource untuk UserController pada file routes/web.php.
    4.6 File UserController

    Setelah rute sudah berhasil di buat, selanjutnya adalah isi file tersebut seperti pada gambar.

    Kode UserController bagian 1
    Kode UserController bagian pertama.
    Kode UserController bagian 2
    Kode UserController bagian kedua.
    Kode UserController bagian 3
    Kode UserController bagian ketiga.
    4.7 Create Users

    Route untuk menampilkan view form tambah data user adalah user/create. Silahkan buka file UserController kemudian pada action create edit kode program menjadi seperti berikut.

    Kode create blade php bagian 1
    Kode file create.blade.php bagian pertama.
    Kode create blade php bagian 2
    Kode file create.blade.php bagian kedua.

    Jika sudah, silahkan di cek apakah hasilnya sudah sama dengan gambar berikut.

    Tampilan form create user pada browser
    Hasil tampilan form create user pada browser.
    Tampilan form create user dengan template SB Admin 2
    Tampilan form create user setelah integrasi template SB Admin 2.
    4.8 Read / List Users

    Selanjutnya setelah fungsi create selesai, kita akan menyimpan dan menampilkan data user. Untuk menampilkan data user kita akan menggunakan method GET pada rute localhost/users yang mana rute ini merupakan action index pada UserController. Buka action index kemudian edit menjadi seperti kode program berikut.

    Selanjutnya buat file dengan nama index.blade.php pada folder views/user dan isi dengan kode program berikut.

    Kode index blade php untuk menampilkan list user
    Kode file index.blade.php untuk menampilkan daftar user.

    Untuk mengecek apakah sudah berhasil, coba lakukan penginputan data seperti pada gambar.

    Tampilan list user pada browser
    Hasil tampilan daftar user pada browser.

    Setelah di tambahkan kode ini maka tampilan list user akan menjadi seperti berikut.

    Tampilan list user final dengan DataTables
    Tampilan akhir daftar user dengan fitur DataTables.
    4.9 Update User

    Tahap berikutnya dalam proses pengelolaan data pengguna adalah menyediakan antarmuka untuk mengedit data pengguna. Langkah ini dimulai dengan mengimplementasikan logika pada file edit.blade.php di dalam direktori views/user, yang akan memanfaatkan method edit pada UserController serta menggunakan method HTTP PUT untuk proses pengiriman perubahan.

    Saat pengguna mengakses URL dengan format users/{user}/edit, di mana {user} merepresentasikan ID unik dari data yang dipilih. Langkah berikut adalah mengimplementasikan logika perubahan data pada method edit di dalam UserController.

    Kode edit blade php untuk form update user
    Kode file edit.blade.php untuk form update data user.
    Kode lanjutan edit blade php
    Kode lanjutan file edit.blade.php.

    Tampilan form jika sudah akan menjadi seperti ini.

    Tampilan form edit user pada browser
    Hasil tampilan form edit user pada browser.
    4.10 Delete Users

    Tambahkan tombol atau link pada list user, silahkan buka view user index.blade.php dan tambahkan kode program berikut di bawah link edit.

    Kode tombol delete pada halaman list user
    Penambahan tombol delete pada halaman daftar user.

    Untuk mengecek apakah sudah berhasil, coba lakukan penghapusan data seperti pada gambar.

    Proses penghapusan data user
    Proses penghapusan data user berhasil dilakukan.
  5. Kesimpulan

    Berdasarkan pelaksanaan praktikum yang telah dilakukan, dapat disimpulkan bahwa Laravel merupakan framework PHP yang sangat efektif dalam membangun aplikasi web yang terstruktur, efisien, dan mudah dikelola melalui penerapan arsitektur MVC (Model-View-Controller). Penggunaan fitur migration menjadi sebuah praktik utama dalam pengelolaan basis data yang terstruktur, migration dan seeder membantu mempercepat proses pengembangan aplikasi. Dengan DataSeeder, data awal dapat disediakan dan dikelola secara efisien sebagai fondasi data pengguna.

    Selain itu, integrasi template eksternal seperti SB Admin 2 berhasil memberikan antarmuka pengguna yang profesional dan responsif. Pendekatan konsep layouting modular dengan komponen sidebar dan topbar memungkinkan struktur kode yang lebih rapi dan mudah untuk dipelihara di masa depan. Praktik implementasi fitur CRUD (Create, Read, Update, Delete) menggunakan Resource Controller serta penambahan fitur DataTables memperlihatkan kemampuan pengelolaan data untuk pembangunan fungsi pengelolaan pengguna secara prosedural. Dengan demikian, praktikum ini memberikan mahasiswa pemahaman dan kemampuan dasar yang diperlukan untuk membangun sebuah aplikasi berbasis web yang terorganisir.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Pemrograman Web

Praktikum Laravel: Routing, View, dan Controller

Ringkasan laporan praktikum tentang pengenalan Laravel sebagai framework PHP berbasis arsitektur MVC.

  1. Pendahuluan

    Laravel merupakan salah satu framework PHP yang banyak digunakan dalam pengembangan aplikasi berbasis web. Framework ini mendukung konsep arsitektur MVC atau Model-View-Controller, sehingga proses pengembangan aplikasi menjadi lebih terstruktur, rapi, dan mudah dikelola.

    Pada praktikum ini, mahasiswa diperkenalkan dengan Laravel mulai dari pemahaman dasar mengenai framework Laravel, kebutuhan perangkat lunak yang digunakan, struktur dasar project Laravel, hingga konsep MVC yang menjadi dasar utama dalam pengembangan aplikasi menggunakan Laravel.

  2. Tujuan

    • Mahasiswa mampu memahami dasar-dasar framework Laravel sebagai framework PHP untuk pengembangan aplikasi web.
    • Mahasiswa mampu mengetahui tools dan kebutuhan awal yang diperlukan untuk membuat project Laravel.
    • Mahasiswa mampu mengenal struktur dasar Laravel serta memahami konsep MVC, yaitu Model, View, dan Controller.
  3. Alat atau Tools yang Dipakai

    • Laragon atau XAMPP
    • Visual Studio Code
    • Composer
    • Git dan GitHub
    • Node JS dan NPM
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses persiapan dan konfigurasi awal Laravel sesuai dengan modul praktikum. Tahapan pengerjaan dimulai dari pengecekan kebutuhan sistem, pembuatan project Laravel, menjalankan project, hingga mengenal struktur dasar Laravel dan konsep MVC.

    4.1 Mengecek Kebutuhan Sistem Laravel

    Sebelum membuat project Laravel, terlebih dahulu dilakukan pengecekan terhadap beberapa tools yang dibutuhkan. Laravel membutuhkan PHP, Composer, Git, Node JS, dan NPM agar proses pembuatan serta pengembangan project dapat berjalan dengan baik.

    Bisa dilihat pada gambar untuk bagaimana cara mengecek kebutuhan system dari Laravel.

    Screenshot pengecekan versi PHP Composer Git Node JS dan NPM
    Pengecekan versi PHP, Composer, Git, Node JS, dan NPM melalui terminal.

    Setelah perintah tersebut dijalankan, terminal akan menampilkan versi dari masing-masing tools. Jika seluruh tools sudah menampilkan versi, maka tools tersebut sudah berhasil terpasang dan dapat digunakan.

    4.2 Membuat Project Laravel

    Setelah semua kebutuhan sistem terpenuhi, langkah selanjutnya adalah membuat project Laravel. Pada praktikum ini, project Laravel dapat dibuat menggunakan Composer atau Laravel Installer.

    Gunakan perintah composer create-project laravel/laravel:^12 PraktWeb1 --prefer-dist.

    Screenshot perintah composer create project Laravel
    Proses awal pembuatan project Laravel menggunakan Composer.
    Screenshot proses instalasi dependensi Laravel selesai
    Proses instalasi package, generate application key, dan migration awal Laravel.
    4.3 Masuk ke Folder Project

    Setelah project berhasil dibuat, langkah berikutnya adalah masuk ke dalam folder project menggunakan perintah cd PraktWeb1.

    4.4 Menjalankan Project Laravel

    Untuk menjalankan project Laravel, digunakan perintah Artisan php artisan serve. Setelah perintah dijalankan, Laravel akan menjalankan server lokal. Biasanya aplikasi dapat diakses melalui browser dengan alamat http://127.0.0.1:8000. Jika berhasil, maka halaman awal Laravel akan tampil pada browser.

    Screenshot halaman awal Laravel dan terminal php artisan serve
    Project Laravel berhasil dijalankan pada server lokal melalui perintah php artisan serve.
    4.5 Menampilkan Halaman Hello World

    Setelah project Laravel berhasil dijalankan, langkah berikutnya adalah mencoba menampilkan halaman sederhana. Hal ini dilakukan untuk memastikan bahwa routing dan tampilan pada Laravel dapat berjalan dengan baik.

    Route sederhana dapat dibuat untuk menampilkan teks Hello World pada browser.

    Screenshot route hello world pada file web php
    Penambahan route /hello pada file routes/web.php.
    Screenshot hasil halaman hello world di browser
    Hasil tampilan halaman /hello pada browser.
    4.6 Challenge
    • Buat controller, beri nama UserController.
    • Di dalam controller, buat sebuah function dengan nama index.
    • Buat view di dalam folder resources dengan struktur user/index.
    • Dalam file index, buat tampilan HTML sederhana.
    • Buatkan routing /user menggunakan view tersebut.
    Screenshot kode userController php
    Pembuatan controller userController dengan function index.
    Screenshot file index blade php untuk halaman user
    Pembuatan view resources/views/user/index.blade.php.
    Screenshot route user pada file web php
    Penambahan route /user yang mengarah ke userController.
    Screenshot hasil halaman user di browser
    Hasil tampilan halaman /user pada browser.
  5. Kesimpulan

    Praktikum ini memberikan pemahaman awal mengenai alur kerja Laravel dan bagaimana routing, view, serta controller saling terhubung dalam membangun halaman web yang terstruktur.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Pemrograman Web

Praktikum Laravel: Migration, Seeding, Routing, Model, Controller, dan View

Ringkasan laporan praktikum tentang pengelolaan database dan pembuatan fitur web Laravel menggunakan alur MVC.

  1. Pendahuluan

    Laravel merupakan salah satu framework PHP yang digunakan dalam pengembangan aplikasi web secara terstruktur. Laravel menerapkan konsep MVC atau Model-View-Controller, yaitu pemisahan alur kerja aplikasi menjadi tiga bagian utama. Model digunakan untuk berinteraksi dengan database, View digunakan untuk menampilkan halaman kepada pengguna, sedangkan Controller digunakan untuk mengatur logika aplikasi dan menghubungkan Model dengan View.

    Pada praktikum ini, pembahasan difokuskan pada beberapa konsep penting dalam pengembangan aplikasi Laravel, yaitu migration, seeding, routing, model, controller, dan view. Migration digunakan untuk membuat serta mengelola struktur tabel database melalui kode program. Seeding digunakan untuk mengisi data awal ke dalam database. Selain itu, routing digunakan untuk menentukan alamat URL aplikasi, model digunakan untuk mengelola data dari database, controller digunakan untuk mengatur proses aplikasi, dan view digunakan untuk menampilkan data ke halaman web.

    Praktikum dilakukan dengan bantuan XAMPP sebagai server lokal dan pengelola database MySQL. Melalui praktikum ini, mahasiswa dapat memahami hubungan antara database dan aplikasi Laravel, mulai dari konfigurasi database, pembuatan tabel menggunakan migration, pengisian data awal menggunakan seeder, pengambilan data menggunakan model, pengaturan controller, hingga menampilkan data melalui view.

  2. Tujuan

    • Mahasiswa mampu memahami penggunaan migration untuk membuat dan mengelola struktur tabel database pada Laravel.
    • Mahasiswa mampu memahami penggunaan seeding untuk mengisi data awal ke dalam database.
    • Mahasiswa mampu menerapkan konsep Model, View, Controller, dan Routing dalam pengembangan aplikasi Laravel.
    • Mahasiswa mampu menampilkan data dari database ke halaman web menggunakan Model, Controller, dan Blade View.
    • Mahasiswa mampu membangun dasar fitur CRUD sederhana, yaitu menambahkan, menampilkan, mengubah, dan menghapus data.
  3. Alat atau Tools yang Dipakai

    • Laragon atau XAMPP
    • Visual Studio Code
    • Composer
    • Git
    • Node JS
    • NPM
    • GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses konfigurasi database dan pembuatan struktur tabel menggunakan fitur migration pada Laravel. Setelah tabel berhasil dibuat, proses dilanjutkan dengan pembuatan seeder untuk mengisi data awal ke dalam database. Praktikum ini menggunakan XAMPP sebagai server lokal dan MySQL sebagai database.

    4.1 Konfigurasi Database

    Langkah pertama yang dilakukan adalah mengaktifkan Apache dan MySQL melalui XAMPP Control Panel. Apache digunakan untuk menjalankan server lokal, sedangkan MySQL digunakan sebagai database pada project Laravel.

    Setelah MySQL aktif, buka phpMyAdmin melalui browser dengan alamat http://localhost/phpmyadmin. Kemudian buat database baru dengan nama praktikum_laravel. Database ini akan digunakan untuk menyimpan tabel dan data yang dibuat melalui Laravel.

    Pembuatan database praktikum laravel di phpMyAdmin
    Pembuatan database praktikum_laravel melalui phpMyAdmin.

    Setelah database dibuat, langkah berikutnya adalah membuka file .env pada project Laravel. Pada file tersebut, bagian konfigurasi database diubah agar project Laravel dapat terhubung dengan database yang sudah dibuat sebelumnya.

    Konfigurasi yang digunakan adalah DB_CONNECTION=mysql, DB_HOST=127.0.0.1, DB_PORT=3306, DB_DATABASE=praktikum_laravel, DB_USERNAME=root, dan DB_PASSWORD=. Pada XAMPP, username database biasanya menggunakan root, sedangkan password dikosongkan.

    Konfigurasi database Laravel pada file env
    Konfigurasi koneksi database pada file .env.
    4.2 Membuat Migration Table Products

    Setelah konfigurasi database selesai, langkah berikutnya adalah membuat migration. Migration digunakan untuk membuat dan mengelola struktur tabel database melalui kode program. Dengan migration, pembuatan tabel dapat dilakukan langsung dari Laravel tanpa harus membuat tabel secara manual melalui phpMyAdmin.

    Untuk membuat migration tabel products, digunakan perintah php artisan make:migration create_products_table pada terminal. Setelah perintah dijalankan, Laravel akan membuat file migration baru di dalam folder database/migrations.

    File migration create products table di folder migrations
    File migration create_products_table berhasil dibuat pada folder migrations.
    4.3 Mengisi Struktur Tabel pada Migration

    Setelah file migration berhasil dibuat, langkah berikutnya adalah mengatur struktur tabel pada file migration tersebut. File migration yang dibuat digunakan untuk menentukan kolom apa saja yang akan ada di dalam tabel products.

    Pada bagian function up(), ditambahkan struktur tabel seperti id, name, price, description, created_at, dan updated_at. Kolom-kolom tersebut digunakan untuk menyimpan data produk yang nantinya akan ditampilkan pada halaman web.

    Kode struktur tabel products pada function up
    Struktur tabel products dituliskan pada function up().

    Selanjutnya, pada bagian function down(), dituliskan perintah Schema::dropIfExists('products'). Function down() digunakan untuk menghapus tabel jika migration dibatalkan atau dilakukan rollback.

    Kode function down untuk menghapus tabel products
    Function down() digunakan untuk menghapus tabel ketika migration di-rollback.
    4.4 Menjalankan Migration

    Setelah struktur tabel selesai dibuat pada file migration, langkah berikutnya adalah menjalankan migration. Perintah yang digunakan adalah php artisan migrate. Perintah tersebut digunakan untuk menjalankan file migration yang sudah dibuat, sehingga tabel products secara otomatis terbentuk pada database praktikum_laravel.

    Untuk memastikan tabel berhasil dibuat, database dapat dicek melalui phpMyAdmin. Jika berhasil, maka tabel products akan muncul di dalam database.

    Tabel products berhasil terbentuk di database
    Tabel products berhasil terbentuk pada database setelah migration dijalankan.
    4.5 Membuat Seeder

    Setelah tabel berhasil dibuat, langkah selanjutnya adalah membuat seeder. Seeder berfungsi untuk mengisi data awal ke dalam database. Dengan menggunakan seeder, data contoh dapat dimasukkan ke tabel tanpa harus menambahkannya secara manual melalui phpMyAdmin.

    Untuk membuat seeder ProductSeeder, digunakan perintah php artisan make:seeder ProductSeeder. Setelah perintah dijalankan, file seeder akan dibuat pada folder database/seeders.

    File ProductSeeder php pada folder seeders
    File ProductSeeder.php berhasil dibuat pada folder seeders.
    4.6 Mengisi Data pada ProductSeeder

    Setelah file ProductSeeder dibuat, langkah berikutnya adalah mengisi data awal yang akan dimasukkan ke dalam tabel products. Isi file ProductSeeder dapat ditulis dengan menggunakan perintah insert ke tabel products.

    Data yang dimasukkan berupa contoh produk, seperti Laptop dan Mouse. Masing-masing data berisi nama produk, harga, deskripsi, serta waktu pembuatan dan pembaruan data. Data tersebut nantinya akan tersimpan di database setelah seeder dijalankan.

    Kode pengisian data awal produk pada ProductSeeder
    Kode pengisian data awal produk pada file ProductSeeder.php.
    4.7 Memanggil ProductSeeder pada DatabaseSeeder

    Agar ProductSeeder dapat dijalankan, seeder tersebut perlu dipanggil terlebih dahulu pada file DatabaseSeeder.php. Pada bagian function run(), ditambahkan pemanggilan $this->call(ProductSeeder::class).

    Kode tersebut digunakan untuk memberi tahu Laravel bahwa ProductSeeder adalah seeder yang akan dijalankan ketika proses seeding dilakukan.

    Pemanggilan ProductSeeder pada DatabaseSeeder
    Pemanggilan ProductSeeder pada file DatabaseSeeder.php.
    4.8 Menjalankan Seeder

    Setelah seeder dipanggil pada file DatabaseSeeder, langkah berikutnya adalah menjalankan seeder. Perintah yang digunakan adalah php artisan db:seed. Perintah tersebut digunakan untuk memasukkan data awal ke dalam tabel products.

    Setelah perintah seeder dijalankan, data dapat dicek melalui phpMyAdmin pada tabel products. Jika berhasil, maka data produk seperti Laptop dan Mouse akan muncul pada tabel tersebut.

    Data produk berhasil masuk ke tabel products
    Data awal produk berhasil masuk ke tabel products setelah seeder dijalankan.
    4.9 Membuat Routing

    Setelah proses migration dan seeding selesai, langkah berikutnya adalah membuat routing. Routing digunakan untuk menentukan alamat URL yang dapat diakses oleh pengguna, serta menentukan respon apa yang akan ditampilkan oleh aplikasi.

    Pada Laravel, routing untuk halaman web berada pada file web.php yang terdapat di dalam folder routes. File ini menjadi tempat untuk mendefinisikan hubungan antara URL dan proses yang dijalankan oleh aplikasi.

    4.10 Routing Dasar

    Routing dasar digunakan untuk menampilkan respon sederhana ketika sebuah URL diakses. Contohnya, ketika pengguna membuka halaman utama, Laravel dapat menampilkan teks atau halaman tertentu sebagai respon.

    Kode routing dasar dapat dituliskan pada file routes/web.php. Setelah server Laravel dijalankan dengan perintah php artisan serve, halaman dapat dibuka melalui alamat http://127.0.0.1:8000.

    Kode routing dasar pada file web php
    Kode routing dasar dituliskan pada file web.php.
    Hasil tampilan routing dasar di browser
    Hasil tampilan routing dasar ketika URL diakses melalui browser.
    4.11 Routing Parameter

    Routing parameter digunakan untuk menangkap nilai tertentu dari URL. Parameter ini biasanya digunakan ketika ingin menampilkan data berdasarkan id atau kode tertentu.

    Contohnya, route /produk/{id} dapat digunakan untuk menangkap nilai id produk. Jika pengguna membuka alamat /produk/1, maka Laravel akan mengambil nilai 1 dari URL dan menampilkannya sebagai bagian dari respon.

    Kode routing parameter produk id
    Contoh routing parameter untuk menangkap nilai id dari URL.
    Hasil tampilan routing parameter produk id di browser
    Nilai parameter dari URL berhasil ditampilkan pada browser.
    4.12 Named Route

    Named route digunakan untuk memberikan nama pada sebuah route. Dengan named route, pemanggilan URL dapat dilakukan menggunakan nama route, bukan langsung menuliskan alamat URL secara lengkap.

    Hal ini dapat membantu ketika route digunakan pada banyak bagian aplikasi. Jika alamat URL berubah, bagian lain yang menggunakan nama route tetap lebih mudah disesuaikan.

    Contoh kode named route dashboard
    Contoh named route dengan nama dashboard.
    4.13 Route Group

    Route group digunakan untuk mengelompokkan beberapa route yang memiliki awalan URL yang sama. Dengan menggunakan route group, penulisan route menjadi lebih rapi dan tidak perlu mengulang awalan URL berkali-kali.

    Contohnya, beberapa route yang berada di bawah awalan /admin dapat dimasukkan ke dalam satu group. Dengan begitu, route seperti dashboard dan products dapat dikelola dalam kelompok route yang sama.

    Contoh kode route group dengan prefix admin
    Contoh route group dengan prefix admin.
    4.14 Membuat Model Product

    Setelah memahami routing, langkah berikutnya adalah membuat model. Model digunakan untuk berinteraksi dengan database. Pada Laravel, model bekerja dengan Eloquent ORM sehingga proses mengambil, menambahkan, mengubah, dan menghapus data dari database dapat dilakukan dengan lebih mudah.

    Untuk membuat model Product, digunakan perintah php artisan make:model Product. Model ini nantinya digunakan untuk mengambil data dari tabel products.

    4.15 Mengatur Isi Model Product

    Setelah file Product.php dibuat, langkah berikutnya adalah mengatur model agar dapat digunakan untuk mengelola data pada tabel products. Pada model, dapat ditentukan kolom yang boleh diisi secara massal menggunakan properti $fillable.

    Kolom yang dapat dimasukkan ke dalam $fillable antara lain name, price, dan description. Dengan pengaturan ini, Laravel mengetahui data apa saja yang boleh diproses melalui model Product.

    Kode model Product dengan properti fillable
    Pengaturan model Product dengan properti $fillable.
    4.16 Membuat Folder Layout

    Langkah pertama dalam membuat Blade Layout adalah membuat folder baru di dalam folder resources/views. Folder tersebut diberi nama layouts. Folder ini digunakan untuk menyimpan file layout utama yang dapat digunakan oleh beberapa halaman view.

    4.17 Membuat File app.blade.php

    Setelah folder layout dibuat, langkah berikutnya adalah membuat file app.blade.php. File ini berfungsi sebagai template utama untuk tampilan aplikasi. Di dalam file ini terdapat struktur HTML dasar seperti html, head, dan body.

    Pada bagian tertentu digunakan directive Blade seperti @yield('title') dan @yield('content'). Bagian @yield('title') digunakan sebagai tempat untuk menampilkan judul halaman, sedangkan @yield('content') digunakan sebagai tempat untuk menampilkan isi utama dari halaman.

    Kode file layout utama app blade php
    File layout utama app.blade.php sebagai template dasar tampilan.
    4.18 Menggunakan Layout pada View Products

    Setelah layout utama dibuat, langkah berikutnya adalah menggunakan layout tersebut pada view products. Pada bagian atas file view, dituliskan @extends('layouts.app') untuk menggunakan layout utama.

    Selanjutnya, @section('title', 'Products') digunakan untuk mengisi judul halaman, sedangkan @section('content') digunakan untuk menulis isi utama halaman. Dengan cara ini, file products tidak perlu menuliskan struktur HTML lengkap karena struktur utama sudah diambil dari file layout.

    Kode view products menggunakan layout app blade
    View products menggunakan layout utama dengan @extends dan @section.
    4.19 Menampilkan Data Produk Menggunakan Blade

    Untuk menampilkan data produk dari database, digunakan perulangan Blade. Data produk yang dikirim dari controller dapat ditampilkan menggunakan @foreach. Setiap data produk kemudian ditampilkan pada halaman, misalnya nama produk, harga, dan deskripsi.

    Dengan menggunakan Blade, proses menampilkan data menjadi lebih sederhana karena Laravel menyediakan sintaks khusus untuk menulis logika tampilan di dalam file view.

    Kode perulangan Blade untuk menampilkan data produk
    Perulangan Blade digunakan untuk menampilkan data produk dari database.
    4.20 Tugas

    Pada bagian tugas, dibuat fitur CRUD sederhana untuk data mahasiswa. Langkah pertama adalah membuat database baru melalui phpMyAdmin, kemudian mengatur koneksi database pada file .env. Setelah koneksi berhasil, dibuat model mahasiswa, migration untuk tabel mahasiswa, seeder data awal, route, controller, dan view untuk mengelola data.

    Pembuatan database db mahasiswa di phpMyAdmin
    Pembuatan database baru untuk data mahasiswa melalui phpMyAdmin.
    Konfigurasi database mahasiswa pada file env
    Konfigurasi koneksi database mahasiswa pada file .env.

    Setelah database terhubung, dibuat model Mahasiswa pada folder app/Models. Pada model tersebut, properti $fillable diisi dengan kolom nim, nama, dan jurusan agar data dapat diproses secara massal.

    Kode model Mahasiswa dengan fillable nim nama jurusan
    Pengaturan model Mahasiswa dengan kolom nim, nama, dan jurusan.

    Selanjutnya, dibuat file migration untuk menyusun struktur tabel mahasiswa. Migration dibuat melalui terminal, kemudian struktur tabel diatur pada file migration yang telah dibuat. Kolom yang digunakan antara lain nim, nama, dan jurusan.

    Perintah membuat migration create mahasiswas table
    Perintah untuk membuat file migration tabel mahasiswa.
    Kode migration tabel mahasiswa
    Struktur tabel mahasiswa dituliskan pada file migration.

    Setelah struktur tabel selesai dibuat, migration dijalankan menggunakan perintah php artisan migrate. Jika berhasil, tabel mahasiswa akan dibuat di dalam database sesuai struktur yang sudah ditentukan.

    Perintah php artisan migrate pada terminal
    Perintah php artisan migrate dijalankan melalui terminal.
    Hasil migration berhasil dijalankan
    Migration berhasil dijalankan dan tabel berhasil dibuat.

    Setelah tabel dibuat, dibuat seeder dengan nama MahasiswaSeeder. Seeder ini digunakan untuk memasukkan data akademik sebagai data awal. Agar seeder dapat dijalankan, MahasiswaSeeder dipanggil pada file DatabaseSeeder.php, kemudian dijalankan menggunakan perintah php artisan db:seed.

    Perintah membuat MahasiswaSeeder
    Perintah untuk membuat file MahasiswaSeeder.
    Kode MahasiswaSeeder untuk data awal mahasiswa
    Kode MahasiswaSeeder berisi data awal mahasiswa.
    Pemanggilan MahasiswaSeeder pada DatabaseSeeder
    MahasiswaSeeder dipanggil pada file DatabaseSeeder.php.
    Hasil perintah db seed berhasil
    Seeder dijalankan sehingga data awal mahasiswa masuk ke database.

    Setelah data awal siap, dibuat route resource pada file web.php dengan controller MahasiswaController. Controller ini berisi beberapa method utama, yaitu index untuk menampilkan data, create untuk membuka form tambah data, store untuk menyimpan data baru, edit untuk membuka form edit, update untuk memperbarui data, dan destroy untuk menghapus data.

    Route resource mahasiswa pada file web php
    Route resource mahasiswa ditambahkan pada file web.php.
    Kode awal MahasiswaController
    Bagian awal MahasiswaController untuk menampilkan, membuat, dan menyimpan data.
    Kode update dan delete pada MahasiswaController
    Method update dan destroy digunakan untuk mengubah dan menghapus data mahasiswa.

    Kemudian dibuat beberapa file view di dalam folder resources/views/mahasiswa, yaitu index.blade.php, create.blade.php, dan edit.blade.php. Halaman index digunakan untuk menampilkan daftar mahasiswa, halaman create digunakan untuk menambah data, sedangkan halaman edit digunakan untuk mengubah data yang sudah ada.

    Kode view index mahasiswa
    View index.blade.php digunakan untuk menampilkan daftar mahasiswa dan tombol aksi.
    Kode view create mahasiswa
    View create.blade.php digunakan untuk menambahkan data mahasiswa baru.
    Kode view edit mahasiswa
    View edit.blade.php digunakan untuk mengubah data mahasiswa.

    Output dari tugas ini adalah halaman daftar mahasiswa yang menampilkan data dari database, tombol tambah data, form tambah mahasiswa baru, form edit data mahasiswa, serta tombol untuk menghapus data. Dengan demikian, fitur CRUD sederhana berhasil dibuat menggunakan Laravel.

    Output halaman daftar mahasiswa
    Output halaman daftar mahasiswa yang menampilkan data dari database.
    Output form tambah mahasiswa baru
    Output form tambah mahasiswa baru.
    Output form edit data mahasiswa
    Output form edit data mahasiswa.
  5. Kesimpulan

    Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa Laravel menyediakan fitur yang memudahkan proses pengembangan aplikasi web secara terstruktur melalui konsep MVC atau Model-View-Controller. Pada praktikum ini, mahasiswa mempelajari bagaimana menghubungkan Laravel dengan database, membuat tabel menggunakan migration, mengisi data awal menggunakan seeder, serta menampilkan data melalui model, controller, routing, dan view.

    Selain itu, praktikum ini juga memberikan pemahaman mengenai penggunaan routing untuk menentukan alamat URL pada aplikasi, penggunaan model sebagai penghubung antara aplikasi Laravel dan database, serta penggunaan controller untuk mengatur alur data dari model dan dikirimkan ke view. Dengan demikian, mahasiswa dapat memahami alur kerja Laravel mulai dari database, model, controller, route, hingga tampilan halaman.

    Penggunaan Blade Layout juga membantu dalam membuat tampilan aplikasi menjadi lebih rapi dan terstruktur. Struktur layout memungkinkan bagian HTML utama digunakan kembali pada beberapa halaman, sehingga pembuatan halaman seperti daftar data, form tambah, dan form edit menjadi lebih efisien. Materi ini menjadi dasar penting untuk membangun aplikasi CRUD sederhana pada Laravel.

Pemrograman Web

Praktikum Laravel Relationship

Ringkasan laporan praktikum tentang pembuatan relasi antar tabel pada Laravel menggunakan migration, model, seeder, controller, view, dan query Eloquent Relationship.

  1. Pendahuluan

    Laravel merupakan salah satu framework PHP yang digunakan untuk membangun aplikasi web secara lebih terstruktur dan efisien. Laravel menerapkan konsep MVC atau Model-View-Controller, sehingga proses pengolahan data, tampilan, dan logika aplikasi dapat dipisahkan dengan rapi. Selain itu, Laravel juga menyediakan fitur Eloquent ORM yang memudahkan pengembang dalam mengelola database dan relasi antar tabel.

    Pada praktikum ini, mahasiswa mempelajari konsep relationship atau relasi antar tabel dalam Laravel. Relationship digunakan untuk menghubungkan data yang saling berkaitan, seperti data mahasiswa, jurusan, dan mata kuliah. Relasi yang digunakan adalah One-to-Many, Many-to-One, dan Many-to-Many.

    Praktikum ini juga membahas pembuatan migration, model, seeder, controller, route, dan view. Migration digunakan untuk membuat struktur tabel database, model digunakan untuk mendefinisikan relasi antar data, seeder digunakan untuk mengisi data contoh, controller digunakan untuk mengatur proses pengolahan data, sedangkan view digunakan untuk menampilkan data ke halaman web.

  2. Tujuan

    • Mahasiswa mampu memahami konsep relationship atau relasi antar tabel pada Laravel.
    • Mahasiswa mampu membuat relasi One-to-Many, Many-to-One, dan Many-to-Many pada model Laravel.
    • Mahasiswa mampu membuat migration dengan foreign key dan tabel pivot untuk menghubungkan data antar tabel.
    • Mahasiswa mampu menggunakan Eloquent Relationship untuk mengambil dan mengelola data yang saling berhubungan.
    • Mahasiswa mampu membuat seeder untuk mengisi data awal pada tabel jurusan, mahasiswa, dan mata kuliah.
    • Mahasiswa mampu menampilkan data relationship ke dalam view, seperti data mahasiswa beserta jurusan, mata kuliah, dan total SKS yang diambil.
  3. Alat atau Tools yang Dipakai

    • Laragon atau XAMPP
    • Visual Studio Code
    • Composer
    • Git
    • Node JS
    • NPM
    • GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses pembuatan sistem akademik sederhana menggunakan Laravel Relationship. Tahapan pengerjaan dimulai dari pembuatan migration untuk tabel database, pembuatan model beserta relationship, pembuatan seeder, pembuatan controller, pembuatan route, sampai pembuatan view untuk menampilkan dan menambahkan data mahasiswa.

    4.1 Membuat Migration

    Langkah pertama yang dilakukan adalah membuat migration. Migration digunakan untuk membuat struktur tabel pada database. Pada praktikum ini terdapat beberapa tabel yang dibuat, yaitu tabel majors, students, subjects, dan student_subject. Tabel-tabel tersebut saling berhubungan untuk membentuk sistem akademik sederhana.

    a. Migration untuk Tabel Majors

    Migration pertama yang dibuat adalah tabel majors. Tabel ini digunakan untuk menyimpan data jurusan mahasiswa.

    Perintah membuat migration tabel majors
    Perintah php artisan make:migration create_majors_table.
    Kode migration tabel majors
    Struktur tabel majors berisi kolom id, name, dan timestamps.

    Tabel majors berfungsi untuk menyimpan nama jurusan yang nantinya akan dihubungkan dengan tabel mahasiswa.

    b. Migration untuk Tabel Students

    Selanjutnya dibuat migration untuk tabel students. Tabel ini digunakan untuk menyimpan data mahasiswa seperti NIM, nama, alamat, dan jurusan.

    Perintah membuat migration tabel students
    Perintah php artisan make:migration create_students_table.
    Kode migration tabel students
    Struktur tabel students dengan foreign key major_id yang mengarah ke tabel majors.

    Kolom major_id digunakan sebagai foreign key untuk menghubungkan data mahasiswa dengan data jurusan. Pada bagian NIM dibuat unique agar setiap mahasiswa memiliki NIM yang berbeda.

    c. Migration untuk Tabel Subjects

    Tabel subjects digunakan untuk menyimpan data mata kuliah. Data yang disimpan meliputi nama mata kuliah dan jumlah SKS.

    Perintah membuat migration tabel subjects
    Perintah php artisan make:migration create_subjects_table.
    Kode migration tabel subjects
    Struktur tabel subjects berisi kolom name dan sks.

    d. Migration untuk Tabel Student Subject

    Migration berikutnya adalah tabel student_subject. Tabel ini merupakan tabel pivot yang digunakan untuk menghubungkan tabel students dan subjects.

    Perintah membuat migration tabel student subject
    Perintah php artisan make:migration create_student_subject_table.
    Kode migration tabel student subject
    Tabel pivot student_subject memiliki foreign key student_id dan subject_id.

    Bagian unique digunakan agar kombinasi mahasiswa dan mata kuliah tidak terduplikasi. Setelah seluruh migration selesai dibuat, migration dijalankan menggunakan perintah php artisan migrate.

    4.2 Membuat Model dengan Relationship

    Setelah tabel database dibuat, langkah berikutnya adalah membuat model. Model digunakan untuk menghubungkan aplikasi Laravel dengan tabel database. Selain itu, model juga digunakan untuk mendefinisikan relationship antar tabel.

    a. Model Major

    Model Major digunakan untuk mengelola data pada tabel majors. Pada model Major, ditambahkan properti $fillable agar kolom name dapat diisi secara massal. Relasi yang dibuat adalah students() untuk menunjukkan bahwa satu jurusan dapat memiliki banyak mahasiswa.

    Kode model Major
    Model Major dengan relationship hasMany(Student::class).

    b. Model Student

    Model Student digunakan untuk mengelola data mahasiswa. Pada model ini terdapat relationship major() untuk menghubungkan mahasiswa dengan jurusan, serta relationship subjects() untuk menghubungkan mahasiswa dengan mata kuliah.

    Kode model Student
    Model Student dengan relasi belongsTo ke jurusan dan belongsToMany ke mata kuliah.

    c. Model Subject

    Model Subject digunakan untuk mengelola data mata kuliah. Kolom yang dapat diisi adalah name dan sks. Relationship students() digunakan untuk menunjukkan bahwa satu mata kuliah dapat diambil oleh banyak mahasiswa.

    Kode model Subject
    Model Subject dengan relationship belongsToMany(Student::class).
    4.3 Membuat Seeder untuk Data Sample

    Setelah model dan relationship dibuat, langkah berikutnya adalah membuat seeder. Seeder digunakan untuk mengisi data awal ke dalam database agar aplikasi memiliki data contoh yang dapat ditampilkan.

    a. Seeder untuk Major

    MajorSeeder digunakan untuk mengisi data jurusan ke dalam tabel majors. Data jurusan yang dimasukkan adalah Teknik Informatika, Sistem Informasi, Teknik Komputer, dan Manajemen Informatika.

    Kode MajorSeeder
    Seeder untuk memasukkan data jurusan.

    b. Seeder untuk Subject

    SubjectSeeder digunakan untuk mengisi data mata kuliah ke dalam tabel subjects. Data mata kuliah yang dimasukkan terdiri dari nama mata kuliah dan jumlah SKS.

    Kode SubjectSeeder
    Seeder untuk memasukkan data mata kuliah dan jumlah SKS.

    c. Seeder untuk Student

    StudentSeeder digunakan untuk mengisi data mahasiswa ke dalam tabel students. Setelah data mahasiswa dibuat, setiap mahasiswa diberikan mata kuliah secara acak menggunakan hubungan melalui tabel pivot student_subject.

    Kode StudentSeeder
    Seeder untuk memasukkan data mahasiswa dan menghubungkannya dengan mata kuliah.

    d. Update DatabaseSeeder

    Setelah semua seeder dibuat, seluruh seeder tersebut dipanggil di dalam file DatabaseSeeder agar dapat dijalankan secara berurutan.

    Kode pemanggilan seeder pada DatabaseSeeder
    Pemanggilan MajorSeeder, SubjectSeeder, SubjectScheduleSeeder, dan StudentSeeder.
    4.4 Membuat Controller

    Setelah data dan relationship selesai dibuat, langkah berikutnya adalah membuat controller. Controller digunakan untuk mengatur proses pengambilan, penyimpanan, perubahan, dan penghapusan data mahasiswa.

    Controller yang dibuat adalah StudentController. Pada controller ini terdapat beberapa function, seperti index, show, create, store, edit, update, dan destroy.

    Kode function index pada StudentController
    Function index() mengambil data mahasiswa beserta jurusan dan mata kuliah menggunakan eager loading.
    Kode function show pada StudentController
    Function show() menampilkan detail data mahasiswa berdasarkan ID.
    Kode function create pada StudentController
    Function create() menampilkan form tambah mahasiswa beserta data jurusan dan mata kuliah.
    Kode function store pada StudentController
    Function store() menyimpan mahasiswa baru dan menghubungkan data mata kuliah yang dipilih.
    Kode sync subject pada StudentController
    Method sync() digunakan untuk memperbarui mata kuliah yang diambil mahasiswa.
    Kode detach dan delete pada StudentController
    Function destroy() melepaskan relasi mata kuliah sebelum data mahasiswa dihapus.
    4.5 Membuat Routes

    Setelah controller dibuat, langkah berikutnya adalah membuat route. Route digunakan untuk menentukan alamat URL yang akan mengarah ke controller tertentu.

    Kode route halaman utama mahasiswa
    Route halaman utama diarahkan ke students.index.
    Kode resource route students
    Resource route students menghubungkan function CRUD pada StudentController.
    4.6 Membuat Views

    Setelah controller dan route dibuat, langkah selanjutnya adalah membuat view. View digunakan untuk menampilkan data ke halaman web. Pada praktikum ini, view dibuat menggunakan Blade dan Bootstrap agar tampilan lebih rapi.

    a. Layout Utama

    Layout utama digunakan sebagai template dasar untuk halaman lainnya. Di dalam file ini terdapat struktur HTML, link Bootstrap, navbar, alert success, dan bagian @yield('content').

    Lokasi file layout app blade
    File resources/views/layouts/app.blade.php.
    Kode yield dan script bootstrap pada layout
    Bagian layout untuk menampilkan isi halaman dari view lain.

    b. Index Student

    View index digunakan untuk menampilkan data mahasiswa dalam bentuk tabel. Data yang ditampilkan meliputi NIM, nama, jurusan, mata kuliah, total SKS, dan aksi.

    Lokasi file index blade students
    File resources/views/students/index.blade.php.
    Kode view index students
    Perulangan data mahasiswa, jurusan, mata kuliah, total SKS, dan tombol aksi.

    c. Create Student

    View create adalah halaman tambah mahasiswa. Form ini berisi input NIM, nama, alamat, pilihan jurusan, dan pilihan mata kuliah.

    Lokasi file create blade students
    File resources/views/students/create.blade.php.
    Kode form action students store
    Form dikirim ke route students.store menggunakan method POST.
    Kode dropdown jurusan pada form
    Bagian jurusan ditampilkan menggunakan dropdown dari data majors.
    Kode checkbox mata kuliah pada form
    Bagian mata kuliah menggunakan checkbox karena mahasiswa dapat mengambil lebih dari satu mata kuliah.
    4.7 Latihan Query dengan Relationship

    Pada bagian latihan ini dilakukan pembuatan query menggunakan Eloquent Relationship. Query yang dibuat tidak menggunakan SQL secara langsung, tetapi menggunakan model dan relasi yang sudah dibuat sebelumnya.

    a. Menampilkan Semua Mahasiswa Beserta Jurusan dan Mata Kuliahnya

    Method with() digunakan untuk mengambil data relasi dari model Student. Relasi major digunakan untuk mengambil data jurusan mahasiswa, sedangkan relasi subjects digunakan untuk mengambil data mata kuliah yang diambil oleh mahasiswa.

    Query menampilkan semua mahasiswa dengan jurusan dan mata kuliah
    Query untuk mengambil semua mahasiswa beserta jurusan dan mata kuliah.

    b. Menampilkan Jurusan yang Memiliki Mahasiswa Terbanyak

    Method withCount('students') digunakan untuk menghitung jumlah mahasiswa pada setiap jurusan. Setelah itu data diurutkan dari jumlah mahasiswa terbanyak.

    Query jurusan dengan mahasiswa terbanyak
    Query untuk mencari jurusan yang memiliki mahasiswa terbanyak.

    c. Menampilkan Mata Kuliah yang Diambil oleh Mahasiswa Tertentu

    Query berikut mencari mahasiswa berdasarkan NIM, kemudian mengambil data mata kuliah yang berhubungan dengan mahasiswa tersebut melalui relasi subjects.

    Query mata kuliah yang diambil mahasiswa tertentu
    Query untuk mengambil mata kuliah dari mahasiswa tertentu.

    d. Menampilkan Total SKS yang Diambil Setiap Mahasiswa

    Setelah data mahasiswa dan mata kuliahnya diambil, total SKS dapat dihitung dengan menjumlahkan kolom SKS dari setiap mata kuliah yang diambil mahasiswa.

    Query total SKS setiap mahasiswa
    Query untuk menghitung total SKS yang diambil setiap mahasiswa.

    e. Output

    Output semua mahasiswa beserta jurusan dan mata kuliah
    Output semua mahasiswa beserta jurusan dan mata kuliahnya.
    Output jurusan terbanyak dan mata kuliah mahasiswa tertentu
    Output jurusan dengan mahasiswa terbanyak serta mata kuliah yang diambil oleh mahasiswa tertentu.
    Output total SKS yang diambil setiap mahasiswa
    Output total SKS yang diambil setiap mahasiswa.
  5. Kesimpulan

    Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa Laravel dapat digunakan untuk membangun aplikasi web yang memiliki hubungan antar tabel database secara terstruktur. Pada praktikum ini, sistem yang dibuat adalah sistem akademik sederhana yang menghubungkan data mahasiswa, jurusan, dan mata kuliah menggunakan konsep relationship pada Laravel.

    Melalui praktikum ini, telah dilakukan pembuatan migration untuk tabel majors, students, subjects, dan student_subject. Tabel tersebut digunakan untuk membentuk relasi antara jurusan, mahasiswa, dan mata kuliah. Relasi yang diterapkan yaitu One-to-Many antara jurusan dan mahasiswa, Many-to-One antara mahasiswa dan jurusan, serta Many-to-Many antara mahasiswa dan mata kuliah melalui tabel pivot.

    Selain itu, praktikum ini juga membahas pembuatan model beserta relationship, pembuatan seeder untuk mengisi data awal, pembuatan controller untuk mengelola proses CRUD mahasiswa, pembuatan route, serta pembuatan view untuk menampilkan daftar mahasiswa dan form tambah mahasiswa. Data yang ditampilkan pada halaman mahasiswa sudah memanfaatkan relationship, seperti menampilkan nama jurusan, daftar mata kuliah yang diambil, dan total SKS dari setiap mahasiswa.

    Pada bagian latihan, dilakukan penggunaan query Eloquent Relationship untuk menampilkan semua mahasiswa beserta jurusan dan mata kuliahnya, mencari jurusan dengan mahasiswa terbanyak, menampilkan mata kuliah yang diambil oleh mahasiswa tertentu, serta menghitung total SKS setiap mahasiswa. Dengan demikian, praktikum ini membantu mahasiswa memahami cara membangun aplikasi Laravel yang menggunakan relasi database secara efisien, rapi, dan mudah dikelola.

Source Archive

Repository Praktikum

Kode dan arsip project Laravel Relationship dapat dibuka melalui repository GitHub berikut.

Buka GitHub
OOP

Praktikum Java GUI: Aplikasi Presensi Piket

Ringkasan laporan praktikum tentang penerapan konsep OOP pada aplikasi desktop sederhana berbasis Java GUI.

  1. Pendahuluan

    Pemrograman berorientasi objek membantu pengembang membangun aplikasi dengan struktur class dan object yang jelas. Pada Java, konsep OOP dapat diterapkan dalam pembuatan aplikasi desktop menggunakan komponen GUI seperti form, button, table, dan event listener.

    Praktikum ini membahas pembuatan aplikasi presensi piket sederhana untuk melatih penggunaan class, object, event handling, dan operasi data dasar.

  2. Tujuan

    • Mahasiswa mampu menerapkan konsep class dan object pada aplikasi Java.
    • Mahasiswa mampu membuat form input dan tabel data pada aplikasi GUI.
    • Mahasiswa mampu menerapkan operasi simpan, ubah, hapus, dan reset data.
  3. Alat atau Tools yang Dipakai

    • Java Development Kit
    • NetBeans atau IntelliJ IDEA
    • Java Swing
    • Git dan GitHub
  4. Dokumentasi Praktikum

    Screenshot aplikasi presensi piket Java
    Tampilan aplikasi GUI Java untuk pencatatan presensi piket.
  5. Kesimpulan

    Praktikum ini memperkuat pemahaman konsep OOP melalui aplikasi nyata yang memiliki input pengguna, tabel data, dan aksi pengelolaan data sederhana.

Projek

DocuTemplate — Smart Report Template Extractor

Aplikasi otomatis untuk mengubah laporan praktikum yang sudah jadi (.docx) menjadi template bersih yang siap dipakai ulang, dengan menjaga format asli dan menghapus konten lama.

  1. Pendahuluan

    Dalam proses akademik, laporan praktikum sering kali menjadi referensi untuk praktikum berikutnya. Namun, menyalin dan menghapus konten lama satu per satu memakan waktu dan rawan kesalahan pada format.

    DocuTemplate adalah tool otomatis yang mengubah laporan praktikum yang sudah jadi menjadi template bersih siap dipakai ulang. Tool ini mempertahankan format asli (cover, logo, margins, heading, numbering, page breaks) sambil menghapus konten lama dan mengganti data identitas dengan placeholder seperti {{NAMA}}, {{NIM}}, {{KELAS}}.

    Keunggulan DocuTemplate adalah proses yang 100% deterministik — tidak memerlukan AI atau API eksternal, sehingga hasilnya konsisten dan dapat dipercaya.

  2. Fitur Utama

    • Menjaga format asli — cover, logo, margins, heading, numbering, page breaks tetap utuh
    • Menghapus konten lama — isi laporan dihapus, struktur dan format tetap ada
    • Ganti data identitas dengan placeholder — Nama/NIM/Kelas → {{NAMA}}/{{NIM}}/{{KELAS}}
    • Bekerja otomatis tanpa AI — 100% deterministik, tidak perlu internet/API key
    • Smart Detection — Mendeteksi elemen halaman (cover, heading, body, tabel, gambar) secara otomatis
    • Leak Prevention — Mencegah konten lama "bocor" ke template dengan second-pass comparison
  3. Teknologi & Stack

    • Backend: Python 3.11+, FastAPI, python-docx, Pydantic
    • Frontend: Next.js, React, TypeScript
    • Deployment: Docker, Docker Compose
    • API: REST API dengan Swagger UI Documentation
  4. Cara Instalasi & Penggunaan

    1. Quick Start dengan Docker (Paling Mudah)

    Prerequisite: Docker harus sudah terinstall

    Langkah:

    • Clone project: git clone https://github.com/ArmnskBamban/DocuTemplate.git
    • Masuk folder: cd DocuTemplate
    • Jalankan: docker compose up --build
    • Buka browser: http://localhost:3000
    • Upload file .docx laporan → Download template bersih!
    2. Install Manual (Tanpa Docker)

    Prerequisite:

    • Python 3.11+ (Download: https://www.python.org/downloads/)
    • Node.js 20+ (Download: https://nodejs.org/)

    Windows:

    • git clone https://github.com/ArmnskBamban/DocuTemplate.git
    • cd DocuTemplate
    • Terminal 1: cd backend && python -m venv .venv && .venv\Scripts\activate && pip install -e ".[dev]"
    • Terminal 2: cd frontend && npm install

    Jalankan:

    • Backend: .venv\Scripts\python -m uvicorn praktikit.api.app:app --host 127.0.0.1 --port 8000
    • Frontend: npm run dev
    • Buka: http://localhost:3000
    3. CLI (Command Line) - Advanced
    • Analyze: uv run praktikit analyze laporan.docx
    • Generate template: uv run praktikit clean laporan.docx --output template.docx
    • Personalized: uv run praktikit clean laporan.docx --output laporan-saya.docx --var NAMA "Jiyad Rifqi" --var NIM "2411533003"
  5. Contoh Input → Output

    Input (Laporan Lama):

    File .docx dengan konten lengkap mencakup cover, nama/NIM/kelas, bab-bab pendahuluan dengan isi detail, tabel hasil eksperimen, gambar, dan struktur dokumen yang kompleks.

    Output (Template Bersih):

    File .docx dengan struktur yang sama, tetapi:

    • Data identitas diganti placeholder: {{NAMA}}, {{NIM}}, {{KELAS}}, {{MODUL}}
    • Isi body paragraf dihapus, diganti placeholder [Isi ... di sini]
    • List items (a), b), c)) dihapus
    • Tabel data dihapus, siap diisi baru
    • Format, heading, structure, gambar tetap dipertahankan
  6. API Endpoints (Untuk Integration)

    Method Path Deskripsi
    POST /api/documents/analyze Analyze DOCX file
    POST /api/documents/{id}/generate Generate template
    GET /api/documents/{id}/download Download hasil
    GET /docs Interactive API Documentation (Swagger UI)
  7. Performance & Requirement

    Kecepatan:

    • Analyze 50-page DOCX: ~1 detik
    • Generate template: ~0.5 detik
    • Total end-to-end: ~2-3 detik

    Requirement:

    • Python 3.11+
    • Node.js 20+ (frontend only)
    • Docker 20.10+ (optional)
    • Disk space: ~500 MB
    • RAM: 2 GB minimum
  8. Security & Keamanan

    • ✅ Original file never modified (works on clone only)
    • ✅ No external API calls
    • ✅ No LLM/AI dependency
    • ✅ Hardened ZIP parser (prevent traversal)
    • ✅ No PII in logs
    • ✅ Encrypted session store (optional)
  9. Kesimpulan

    DocuTemplate adalah solusi praktis dan otomatis untuk mengubah laporan praktikum menjadi template yang siap dipakai ulang. Dengan pendekatan deterministic tanpa AI, tool ini memberikan hasil yang konsisten dan dapat diandalkan. Baik digunakan melalui UI web, CLI, atau API, DocuTemplate memudahkan proses pembuatan dan pengelolaan template dokumen akademik.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Projek

Google Auto-Login: Multi-Akun Berurutan

Skrip Python + Playwright untuk login otomatis ke banyak akun Google secara berurutan, lengkap dengan launcher satu klik untuk memudahkan penggunaan akun pribadi.

  1. Pendahuluan

    Dalam penggunaan sehari-hari, seseorang sering memiliki lebih dari satu akun Google untuk keperluan pribadi, perkuliahan, maupun organisasi. Melakukan login secara manual satu per satu ke setiap akun sangat memakan waktu dan rawan lupa, apalagi jika harus berpindah-pindah sesi secara berkala.

    Google Auto-Login (Banyak Akun) adalah skrip otomasi yang dibangun menggunakan Python dan Playwright. Skrip ini berfungsi untuk melakukan login otomatis ke banyak akun Google secara berurutan hanya dengan satu perintah. Dengan pendekatan ini, proses autentikasi ke banyak akun dapat dilakukan dengan cepat dan tanpa intervensi manual berulang.

    Skrip ini dirancang khusus untuk keperluan pribadi dan hanya diperuntukkan bagi akun yang benar-benar menjadi milik sendiri, sehingga penggunaan tetap aman dan terkendali.

  2. Tujuan

    • Mahasiswa mampu mengotomatisasi proses login ke banyak akun Google secara berurutan menggunakan Playwright.
    • Mahasiswa mampu mempermudah penggunaan banyak akun tanpa perlu login manual berulang-ulang.
    • Mahasiswa mampu menyediakan launcher satu klik (run.bat / run.sh) untuk menjalankan skrip tanpa membuka terminal.
  3. Alat atau Tools yang Dipakai

    • Python 3
    • Playwright
    • Virtual Environment (venv)
    • Command Prompt / Terminal (Windows)
    • Git Bash
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan persiapan environment dan cara menjalankan skrip otomasi login multi-akun Google. Tahapan dimulai dari pengunduhan project, pembuatan virtual environment, instalasi Playwright, penyusunan daftar akun, hingga menjalankan skrip melalui launcher maupun secara manual.

    4.1 Persiapan Project

    Langkah pertama adalah mengunduh project ke folder mana saja di laptop, lalu membuka terminal atau command prompt dan masuk ke folder project tersebut dengan perintah cd lokasi/folder/project/kamu.

    4.2 Membuat Virtual Environment

    Untuk menjaga dependensi tetap rapi, dibuat virtual environment dengan perintah python -m venv venv. Virtual environment ini akan mengisolasi paket Python yang digunakan oleh skrip dari sistem utama.

    4.3 Menginstall Playwright

    Setelah virtual environment tersedia, lakukan instalasi Playwright dengan perintah pip install playwright. Playwright merupakan library yang digunakan untuk mengotomatisasi browser sehingga proses login dapat berjalan secara terprogram.

    Penting untuk selalu mengaktifkan venv sebelum menjalankan skrip. Jika virtual environment tidak diaktifkan, skrip akan gagal dengan error ModuleNotFoundError: No module named 'playwright'.

    4.4 Menyiapkan Daftar Akun

    Daftar akun disimpan pada file akun.txt dengan format email|password per baris. Setiap baris mewakili satu akun Google yang akan diloginkan secara berurutan oleh skrip.

    Contoh isi akun.txt:

    akun1@gmail.com|passwordakun1
    akun2@gmail.com|passwordakun2

    4.5 Cara Menjalankan

    Cara cepat: Klik run.bat (Windows) atau jalankan ./run.sh (Git Bash) untuk langsung menjalankan skrip tanpa membuka terminal.

    Cara manual: Aktifkan virtual environment terlebih dahulu dengan venv\Scripts\activate (Windows), lalu jalankan python login_google.py setiap kali ingin menggunakan skrip.

  5. Struktur File Penting

    • login_google.py — skrip utama otomasi login.
    • akun.txt — daftar akun dengan format email|password per baris.
    • run.bat / run.sh — launcher otomatis satu klik.
    • venv/ — virtual environment yang berisi Playwright.
  6. Kesimpulan

    Google Auto-Login (Banyak Akun) merupakan solusi otomasi sederhana namun efektif untuk melakukan login ke banyak akun Google secara berurutan menggunakan Python dan Playwright. Dengan bantuan virtual environment dan launcher satu klik, skrip ini mudah dijalankan tanpa perlu konfigurasi terminal yang rumit. Penggunaan skrip tetap diperuntukkan bagi akun milik sendiri demi menjaga keamanan dan privasi.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Projek

GForm Automator: Auto Google Form Filler

Otomasi pengisian Google Form dengan Stealth Mode dan Headless Browser menggunakan Playwright untuk bypass bot detection, dilengkapi form analyzer dan smart answer generator.

  1. Pendahuluan

    Google Form merupakan tools yang sering digunakan untuk survey, pendaftaran, dan kuesioner. Namun, untuk keperluan testing atau pengisian form berulang, proses manual sangat memakan waktu dan membosankan. Selain itu, banyak form yang memiliki mekanisme bot detection yang mencegah pengisian otomatis.

    GForm Automator adalah aplikasi otomasi berbasis Node.js dan Playwright yang dapat mengisi Google Form secara otomatis dengan kemampuan Stealth Mode untuk bypass bot detection. Aplikasi ini dilengkapi dengan Form Analyzer untuk mendeteksi otomatis tipe pertanyaan, Smart Answer Generator untuk menghasilkan jawaban berdasarkan konteks, dan simulasi perilaku manusia untuk menghindari detection.

    Fitur Stealth Mode mencakup penghapusan properti webdriver, mock browser features, canvas fingerprinting protection, random user agents, dan human-like typing delays. Dengan pendekatan ini, form automation dapat berjalan lebih natural dan meminimalisir risiko detection.

  2. Tujuan

    • Mahasiswa mampu mengotomatisasi pengisian Google Form dengan Playwright secara efisien.
    • Mahasiswa mampu mengimplementasikan Stealth Mode untuk bypass bot detection dengan teknik anti-detection lanjutan.
    • Mahasiswa mampu menganalisis struktur form secara otomatis dan menghasilkan jawaban yang sesuai dengan konteks pertanyaan.
    • Mahasiswa mampu mensimulasikan perilaku manusia (human-like behavior) untuk menghindari detection sistem otomatis.
  3. Alat atau Tools yang Dipakai

    • Node.js 16+ (LTS)
    • Playwright
    • npm atau yarn
    • Terminal / Command Prompt
  4. Fitur Utama

    ✨ Core Features
    • Input URL Google Form — Dukungan link Google Form apa saja
    • Otomatis Login Google — Opsi login otomatis ke akun Google dengan dukungan 2FA manual
    • Stealth Mode — Bypass bot detection dengan advanced anti-detection techniques
    • Headless Mode — Jalankan browser tanpa GUI untuk performa lebih cepat
    • Incognito Mode — Operasi dalam mode incognito untuk privasi
    • Form Analyzer — Deteksi otomatis tipe pertanyaan (10+ tipe didukung)
    • Smart Answer Generator — Generate jawaban otomatis berdasarkan konteks
    • Human-like Behavior — Simulasi perilaku manusia untuk menghindari detection
    🛡️ Stealth Mode Features
    • Hapus properti webdriver untuk menyembunyikan automasi
    • Mock browser features (plugins, languages, chrome object)
    • Canvas fingerprinting protection untuk menghindari tracking
    • AudioContext fingerprinting protection
    • Random user agents dan viewport sizes untuk variasi
    • Human-like mouse movement dengan bezier curves
    • Natural typing delays dengan randomized timing
  5. Tipe Pertanyaan yang Didukung

    ✅ Fully Supported
    • Short Answer — Jawaban singkat
    • Paragraph Text — Teks paragraf panjang
    • Multiple Choice — Pilihan ganda
    • Checkbox — Kotak centang multiple
    • Dropdown — Menu dropdown
    • Date — Pemilihan tanggal
    • Time — Pemilihan waktu
    • File Upload — Upload file (tanpa response)
    🔄 Partially Supported
    • Linear Scale
    • Grid Pilihan Ganda
    • Grid Kotak Centang
    • Date & Time
    • Duration
    ⚠️ Not Supported
    • Complementary question (Data Duplicate)
    • Phone with digits validation
    • Personal data detection
    • Captcha (Google reCAPTCHA, hCaptcha, etc.)
  6. Langkah Instalasi & Penggunaan

    1. Instalasi

    Clone atau download repository:

    git clone https://github.com/ArmnskBamban/AutoFillGform.git

    cd AutoFillGform

    Install dependencies:

    npm install

    2. Penggunaan Interaktif (Terminal UI)

    Jalankan script:

    npm start atau node src/gform-automator.js

    Ikuti prompt di terminal:

    • Masukkan URL Google Form
    • Tentukan apakah form memerlukan login Google
    • Masukkan email dan password Google (jika perlu)
    • Aktifkan Stealth Mode (rekomendasi: ON)
    • Aktifkan Headless Mode (opsional: OFF untuk debugging)

    Script akan otomatis:

    • Mengisi URL yang dimasukkan
    • Login ke Google jika diminta (support 2FA manual)
    • Menganalisis struktur form dan mendeteksi tipe pertanyaan
    • Mengisi semua pertanyaan dengan jawaban yang sesuai
    • Menyubmit form dan menampilkan log detail
    3. Konfigurasi via JSON

    data/config.json — aturan global:

    Atur stealthMode, headlessMode, incognitoMode, dan timing delays.

    data/answers.json — template jawaban:

    Definisikan template jawaban untuk berbagai tipe pertanyaan (name, email, age, feedback, dll).

    data/user-profile.json — profil pengguna:

    Simpan data profil untuk pengisian otomatis (nama, NIM, kelas, jurusan, dll).

  7. Struktur Project

    • src/ — Kode utama aplikasi (gform-automator.js, stealth.js, form-analyzer.js, google-login.js, dll)
    • tests/ — Script test & debug (10 file test-*.js, 3 file debug-*.js)
    • data/ — Data input runtime (config.json, answers.json, user-profile.json)
    • output/ — Hasil generate (screenshot, laporan, log, trainer-data.json)
    • docs/ — Dokumentasi lengkap (guides, release-notes, archive)
  8. Security & Keamanan

    • ✅ Original file never modified — Bekerja pada clone only
    • ✅ No external API calls — Semua proses lokal
    • ✅ No LLM/AI dependency — Deterministik tanpa AI
    • ✅ No PII in logs — Password dan kredensial hanya di memori
    • ✅ Hardened parser — Prevent traversal dan injection
    • ⚠️ Rate Limiting — Gunakan dengan bijak untuk menghindari IP block
    • ⚠️ Google ToS Compliance — Pastikan mematuhi Terms of Service
  9. Output Logging

    Script mencatat detail log untuk debugging dan monitoring. Setiap step ditampilkan dengan emoji indicator untuk memudahkan tracking proses automation:

    • ⏳ Memulai proses automation
    • 🚀 Meluncurkan browser
    • 🔐 Melakukan login ke Google (jika diperlukan)
    • 📝 Membuka Google Form
    • 🔍 Menganalisis struktur form
    • ✏️ Mengisi form (dengan detail per pertanyaan)
    • 📤 Mengirimkan form
    • 🎉 Form berhasil disubmit
    • 👋 Browser ditutup
  10. Troubleshooting

    • Script fails to load form — Check URL format, verify internet connection, increase timeout settings
    • Form not detected properly — Check if form is loading correctly, increase page wait time, update selectors
    • Bot detection triggered — Enable Stealth Mode, disable Headless Mode temporarily, increase delays between actions
    • 2FA required — Script support manual 2FA, follow on-screen instructions, wait up to 5 minutes for verification
  11. Kesimpulan

    GForm Automator merupakan solusi otomasi yang powerful dan fleksibel untuk pengisian Google Form secara otomatis. Dengan kemampuan Stealth Mode untuk bypass bot detection, Form Analyzer untuk deteksi otomatis tipe pertanyaan, dan simulasi perilaku manusia, aplikasi ini dapat mengisi form dengan tingkat keberhasilan yang tinggi. Aplikasi ini sangat berguna untuk keperluan testing, research, dan automation tasks yang memerlukan pengisian form berulang. Penggunaan tetap harus mematuhi Google Terms of Service dan digunakan untuk tujuan yang sah dan legal.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Projek

FileHunt: Web-Based File Search System

Sistem pencarian file berbasis web yang membantu pengguna menemukan file yang benar-benar mereka butuhkan secara langsung — bukan sekadar halaman website yang membahasnya, dengan verifikasi link dan support untuk berbagai tipe file.

  1. Pendahuluan

    Saat mencari file di internet, pencarian web sering mengembalikan halaman web yang membahas tentang file tersebut, bukan file itu sendiri. Ini sangat tidak efisien ketika pengguna membutuhkan file langsung untuk digunakan atau dibaca.

    FileHunt adalah sistem pencarian file berbasis web yang dirancang untuk memecahkan masalah ini. Aplikasi ini tidak hanya mencari link, tetapi juga memverifikasi apakah link benar-benar mengarah ke file yang dapat diakses (PDF, DOCX, XLSX, CSV, ZIP, PPTX), serta menawarkan berbagai mode pencarian yang dioptimalkan untuk berbagai tujuan.

    Aplikasi ini dibangun dengan arsitektur full-stack modern: backend Python FastAPI dan frontend React dengan Vite, dilengkapi dengan sistem verifikasi link, deduplikasi hasil, scoring relevansi, dan support untuk multiple search engines.

  2. Tujuan

    • Mahasiswa mampu membangun sistem pencarian file yang lebih presisi dengan fokus pada hasil yang benar-benar berupa file download, bukan halaman web.
    • Mahasiswa mampu mengimplementasikan sistem verifikasi link untuk memastikan file dapat diakses sebelum ditampilkan kepada pengguna.
    • Mahasiswa mampu mengintegrasikan berbagai search engines (Bing, DuckDuckGo, arXiv API, CrossRef API) dalam satu platform pencarian yang terpadu.
    • Mahasiswa mampu menyediakan mode pencarian khusus untuk berbagai kebutuhan (Academic, Dataset, Official Documents, General Search).
  3. Alat atau Tools yang Dipakai

    • Python 3.12 & FastAPI (Backend)
    • React 18 & Vite (Frontend)
    • Node.js 22.x (Development environment)
    • TailwindCSS v4 (Styling)
    • Git Bash / Command Prompt (Terminal)
    • httpx, duckduckgo-search, feedparser (Python libraries)
  4. Fitur Utama

    ✨ Search Modes
    • General Search — Mencari semua jenis file dari berbagai sumber web
    • Academic Mode — Cari paper akademik dari arXiv dan CrossRef API (10+ PDF papers garansi)
    • Dataset Mode — Cari dataset dalam format CSV, XLSX, ZIP untuk analisis data
    • Official Mode — Cari dokumen resmi dari domain .gov, .edu, .org
    🛡️ File Verification System
    • Link Verification — HEAD request untuk verifikasi file accessibility
    • Size Detection — Mendeteksi ukuran file (KB/MB) dari HTTP headers
    • File Type Detection — Mengidentifikasi tipe file dari extension dan content-type
    • Deduplication — Menghapus duplikat berdasarkan URL hash dan similarity
    🎯 Smart Features
    • Query Optimization — Keyword expansion untuk hasil lebih relevan
    • Relevance Scoring — Skor relevansi berdasarkan keyword match dan authority domain
    • File Type Filtering — Filter PDF, DOCX, XLSX, PPTX, CSV, ZIP
    • Result Sorting — Urutkan berdasarkan relevansi, size, atau verification status
  5. Supported File Types

    • ✅ PDF — Research papers, reports, documents
    • ✅ DOCX — Word documents, reports, papers
    • ✅ XLSX — Excel spreadsheets, datasets, tables
    • ✅ CSV — Comma-separated values data files
    • ✅ ZIP — Compressed archives with multiple files
    • ✅ PPTX — PowerPoint presentations, slides
  6. Langkah Instalasi & Penggunaan

    1. Prerequisites
    • Python 3.12+
    • Node.js 22.x+
    • Git Bash (recommended) atau Command Prompt
    2. Startup - Two Terminal Setup

    Terminal 1 (Backend - Python FastAPI):

    cd project-folder/backend

    venv312/Scripts/python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload

    Terminal 2 (Frontend - React):

    cd project-folder/frontend

    npm run dev

    3. Access & Verification
    • Frontend: http://localhost:3000
    • Backend API: http://localhost:8000
    • API Docs (Swagger): http://localhost:8000/docs
    • Health Check: curl http://localhost:8000/api/health
    4. Search Workflow
    1. Buka http://localhost:3000 di browser
    2. Masukkan query pencarian (misal: "machine learning")
    3. Pilih mode: Academic (recommended), Dataset, Official, atau General
    4. Klik Settings (⚙️) untuk filter file types (opsional)
    5. Klik "Search" dan tunggu ~3-5 detik
    6. Hasil muncul dengan badges: ✓ Verified atau ⚠ Unverified
    7. Klik card atau tombol ↗ untuk membuka file langsung
  7. Tech Stack & Architecture

    Backend (Python FastAPI)
    • Search Orchestrator — Koordinasi antara search engines
    • Verification Module — File verification dan metadata extraction
    • Scoring Engine — Relevansi scoring dan result ranking
    • Search Engines Integration — Bing, DuckDuckGo, arXiv API, CrossRef API
    Frontend (React + Vite)
    • React Query — Data fetching dan caching
    • TailwindCSS v4 — Utility-first styling
    • Axios — HTTP client untuk API calls
    • Lucide React — Icon library
  8. API Endpoints (Backend)

    • GET /api/health — Health check (status: ok, service: filehunt, version: 1.0.0)
    • GET /api/modes — Get available search modes
    • POST /api/search — Main search endpoint dengan query, mode, file_types, max_results
    • GET /api/search/{search_id}/results — Get results untuk search tertentu
    • GET /api/search/{search_id}/status — Check search status
  9. Query Examples yang Terbukti Bekerja

    • Academic (100% working): "machine learning", "artificial intelligence", "neural networks"
    • General/Dataset/Official: "annual report 2024", "dataset covid-19 Indonesia", "struktur data"
    • Best Practice: Gunakan academic mode untuk research papers, dataset mode untuk CSV/XLSX files
  10. Troubleshooting & Solutions

    • Network Issues (Telkomsel): Gunakan Bing search (integrated) atau Academic mode (arXiv/CrossRef API)
    • Port Conflicts: Vite otomatis pilih port 3001, 3002 jika 3000 sudah dipakai
    • SSL Certificate Issues: DuckDuckGo mungkin diblokir, fallback ke Bing otomatis
    • No Results: Gunakan academic mode atau coba query bahasa Inggris
  11. Kesimpulan

    FileHunt merupakan sistem pencarian file yang powerful dan presisi, dirancang khusus untuk menemukan file yang dapat langsung diakses dan digunakan. Dengan arsitektur full-stack modern, multiple search modes, dan sistem verifikasi link, aplikasi ini mengatasi masalah pencarian web tradisional yang sering mengembalikan halaman pembahasan bukan file. Aplikasi ini sangat berguna untuk researcher, student, dan professional yang membutuhkan akses cepat ke file-file seperti research papers, datasets, official documents, dan technical reports.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Aplikasi Mobile

Flutter Widget Dasar: StatelessWidget & StatefulWidget

Implementasi konsep dasar widget Flutter melalui pembuatan aplikasi info saldo dengan fitur toggle visibility menggunakan StatelessWidget untuk komponen statis dan StatefulWidget untuk komponen interaktif.

  1. Pendahuluan

    Flutter merupakan framework open-source yang dikembangkan oleh Google untuk membangun aplikasi mobile yang responsif dan interaktif. Dalam pengembangan aplikasi Flutter, pemahaman terhadap konsep widget menjadi fondasi utama karena seluruh elemen tampilan aplikasi dibangun dari kombinasi widget-widget tersebut. Widget sendiri terbagi menjadi dua kategori utama, yaitu StatelessWidget yang bersifat statis dan StatefulWidget yang dapat berubah secara dinamis sesuai interaksi pengguna. Pemahaman yang baik tentang kedua jenis widget ini akan sangat membantu dalam membangun aplikasi yang efisien dan responsif.

    Pada praktikum kali ini, dilakukan implementasi konsep dasar widget Flutter melalui pembuatan aplikasi sederhana yang menampilkan informasi saldo pengguna. Aplikasi ini terdiri dari dua komponen utama: widget sapaan pengguna yang bersifat statis menggunakan StatelessWidget, dan widget kartu saldo yang interaktif menggunakan StatefulWidget. Komponen kartu saldo dilengkapi dengan fitur toggle visibility yang memungkinkan pengguna menyembunyikan atau menampilkan nominal saldo dengan menekan ikon mata, sehingga memberikan pengalaman interaktif yang sederhana namun fungsional.

    Melalui praktikum ini, diharapkan dapat dipahami perbedaan mendasar antara StatelessWidget dan StatefulWidget, cara kerja fungsi setState() dalam merender ulang tampilan secara dinamis, serta penerapan struktur dasar Flutter menggunakan MaterialApp dan Scaffold. Praktikum ini juga mencakup latihan styling dan modifikasi UI untuk memperdalam pemahaman terhadap properti-properti widget yang sering digunakan dalam pengembangan aplikasi Flutter.

  2. Tujuan

    • Memahami dan menerapkan struktur dasar aplikasi Flutter menggunakan MaterialApp dan Scaffold sebagai kerangka utama pengembangan antarmuka pengguna.
    • Membedakan karakteristik dan implementasi StatelessWidget untuk komponen statis dan StatefulWidget untuk komponen dinamis dalam membangun tampilan aplikasi.
    • Menerapkan fungsi setState() untuk melakukan manajemen state dasar dan merender ulang tampilan secara interaktif sesuai dengan interaksi pengguna.
    • Melakukan kustomisasi styling dan modifikasi UI pada widget Flutter dengan mengubah properti warna, menambahkan elemen teks, serta mengatur tata letak komponen sesuai kebutuhan desain aplikasi.
  3. Alat atau Tools yang Dipakai

    • Flutter SDK
    • Dart Programming Language
    • Android Studio / Visual Studio Code
    • Android Emulator / iOS Simulator
    • Git & GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses implementasi aplikasi Flutter dasar dengan menggunakan StatelessWidget dan StatefulWidget. Tahapan pengerjaan dimulai dari pembuatan struktur aplikasi, implementasi widget statis, widget dinamis, hingga fitur toggle visibility.

    📱 Aplikasi Info Saldo dengan Toggle Visibility

    dashboard_screen.dart

    a. Fungsi main() dan runApp

    Pertama, dibuat fungsi main() yang menjadi titik awal eksekusi aplikasi Flutter. Di dalamnya, dipanggil fungsi runApp() yang akan menjalankan widget utama aplikasi, yaitu MyApp.

    Screenshot main() function
    Fungsi main() sebagai entry point aplikasi
    b. Class MyApp sebagai StatelessWidget

    Selanjutnya, dibuat kelas MyApp yang merupakan StatelessWidget. Widget ini berfungsi sebagai akar dari seluruh aplikasi yang mengatur tema, judul, dan halaman awal yang akan ditampilkan.

    Screenshot Class MyApp
    Class MyApp sebagai root widget
    c. DashboardScreen dengan Scaffold

    Langkah berikutnya adalah membuat halaman utama aplikasi melalui kelas DashboardScreen. Widget ini menggunakan Scaffold yang menyediakan kerangka dasar aplikasi seperti AppBar dan body. AppBar menampilkan judul praktikum dengan warna latar biru, sedangkan body diisi dengan padding dan tata letak Column yang vertikal.

    Screenshot DashboardScreen
    Widget DashboardScreen dengan AppBar dan body
    d. GreetingWidget (StatelessWidget)

    Untuk bagian sapaan pengguna, dibuat GreetingWidget yang merupakan StatelessWidget. Widget ini menggunakan tata letak Row untuk menyusun ikon avatar dan teks sapaan secara horizontal. Ikon avatar dibuat dengan CircleAvatar berwarna biru, sementara teks sapaan diatur dalam Column untuk penyusunan vertikal.

    Screenshot GreetingWidget
    GreetingWidget untuk sapaan pengguna
    e. BalanceCardWidget (StatefulWidget)

    Komponen yang membutuhkan interaktivitas dikembangkan menggunakan StatefulWidget. Didefinisikan kelas BalanceCardWidget yang memiliki kelas state terpisah bernama _BalanceCardWidgetState. Di dalam state class, variabel _isBalanceVisible digunakan untuk menyimpan status tampilan saldo, sementara fungsi _toggleVisibility() bertugas mengubah nilai variabel tersebut.

    Screenshot BalanceCardWidget class
    Class BalanceCardWidget dengan state management
    f. Build Method dengan Card dan Kondisional

    Dalam metode build() dari state class, dibuat kartu saldo menggunakan widget Card dengan desain melengkung (border radius) dan warna biru. Kartu ini memiliki dua bagian utama: baris atas berisi label "Saldo Utama" dan tombol ikon mata yang dapat ditekan. Logika kondisional (ternary operator) diterapkan untuk menentukan ikon yang ditampilkan (Icons.visibility atau Icons.visibility_off) dan teks saldo yang ditampilkan (nominal atau sensor).

    Screenshot Build method dengan Card
    Build method dengan Card dan conditional rendering
    g. Implementasi setState() dan _toggleVisibility

    Fungsi setState() memegang peranan kunci dalam pembaruan tampilan. Saat tombol ikon mata ditekan, fungsi _toggleVisibility() dipanggil dan di dalamnya setState() digunakan untuk mengubah nilai _isBalanceVisible. Flutter kemudian secara otomatis memicu rebuild pada widget BalanceCardWidget, sehingga tampilan diperbarui sesuai dengan status terbaru. Mekanisme ini memungkinkan UI menjadi responsif terhadap interaksi pengguna tanpa perlu memuat ulang halaman.

    h. Hasil Akhir Aplikasi

    Setelah semua komponen dibuat, hasil akhir aplikasi menampilkan dua widget utama secara terintegrasi. Bagian atas layar menampilkan sapaan pengguna yang statis, sementara bagian bawah menampilkan kartu saldo yang interaktif. Pengguna dapat menekan ikon mata pada kartu saldo untuk menyembunyikan atau menampilkan nominal saldo, memberikan pengalaman interaksi yang sederhana namun efektif dalam memahami konsep state management pada Flutter.

    Screenshot Final app result
    Hasil akhir aplikasi dengan kedua widget
  5. Tugas Praktikum

    Pada bagian ini diberikan dua tugas latihan untuk memperdalam pemahaman tentang styling dan modifikasi UI pada aplikasi Flutter yang telah dibuat.

    📝 Tugas 1: Modifikasi Warna Theme

    Ubah warna BalanceCard dari Colors.blueAccent menjadi Colors.teal

    Implementasi

    Pada tugas pertama, dilakukan perubahan warna pada BalanceCard dari warna biru (Colors.blueAccent) menjadi warna hijau emerald (Colors.teal). Perubahan ini dilakukan dengan menambahkan properti color: Colors.teal pada widget Card. Properti color pada widget Card berfungsi untuk mengatur warna background dari kartu tersebut. Dengan mengubah nilai properti ini menjadi Colors.teal, maka tampilan kartu saldo akan berubah menjadi hijau emerald sesuai dengan permintaan tugas.

    Screenshot Tugas 1 - Color change
    Modifikasi warna Card menjadi Colors.teal

    📝 Tugas 2: Penambahan Teks Statis

    Tambahkan teks "No. Rekening: 1234-5678" di bawah nominal saldo

    Implementasi

    Pada tugas kedua, ditambahkan teks statis berupa nomor rekening di bagian bawah nominal saldo di dalam kartu. Penambahan ini dilakukan dengan menambahkan widget Text baru setelah widget Text yang menampilkan nominal saldo. Sebelum teks nomor rekening, ditambahkan widget SizedBox(height: 8) untuk memberikan jarak vertikal sebesar 8 pixel antara teks nominal saldo dengan teks nomor rekening. Teks nomor rekening menggunakan styling dengan ukuran font 14 dan warna Colors.white70 agar terlihat lebih subtle dan tidak mendominasi tampilan nominal saldo.

    Screenshot Tugas 2 - Add account number
    Penambahan teks nomor rekening
    Verifikasi Hasil Tugas

    Jalankan program nya, dan lihat hasil dari tugas apakah sudah terpenuhi dengan memastikan kedua modifikasi tampil dengan benar di aplikasi.

    Screenshot Verification result
    Hasil akhir setelah tugas selesai
  6. Kesimpulan

    Pada praktikum ini, berhasil dipahami dengan baik perbedaan utama antara StatelessWidget dan StatefulWidget. StatelessWidget digunakan untuk komponen yang tampilannya statis dan tidak akan berubah selama aplikasi berjalan, sedangkan StatefulWidget memiliki kemampuan untuk menyimpan dan mengubah data internal melalui state, sehingga memungkinkan komponen tersebut bereaksi terhadap interaksi pengguna seperti tombol yang dapat ditekan dan data yang dapat diubah. Selain itu, fungsi setState() terbukti sangat krusial sebagai mekanisme trigger untuk memicu rebuild UI, sehingga perubahan data pada state akan otomatis tercermin ke tampilan secara instan tanpa perlu memuat ulang halaman.

    Selain memahami konsep widget dan state, telah pula dilakukan penerapan tugas-tugas latihan untuk memperdalam pemahaman tentang styling dan modifikasi UI. Pertama, warna tema pada kartu saldo berhasil diubah dari Colors.blueAccent menjadi Colors.teal sebagai latihan perubahan visual. Kedua, teks "No. Rekening: 1234-5678" berhasil ditambahkan di bagian bawah nominal saldo, yang menunjukkan kemampuan untuk mengembangkan komponen yang sudah ada sesuai kebutuhan desain. Praktikum ini memberikan pemahaman yang cukup komprehensif mengenai kerangka kerja Flutter, pemahaman tentang aliran eksekusi aplikasi, serta keterampilan dasar dalam pembuatan antarmuka pengguna yang responsif.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Aplikasi Mobile

Flutter Layouting: Row, Column, Container & ListTile

Implementasi widget layouting Flutter melalui pembuatan halaman dashboard Expense Tracker dengan integrasi widget Row, Column, Container, ListTile, dan SingleChildScrollView agar halaman terstruktur dan bisa di-scroll.

  1. Pendahuluan

    Perkembangan teknologi mobile yang pesat mendorong semakin banyaknya aplikasi yang dibutuhkan oleh pengguna dalam kehidupan sehari-hari, termasuk aplikasi yang berhubungan dengan pengelolaan keuangan pribadi. Sebuah aplikasi tidak hanya dinilai dari fungsionalitasnya, tetapi juga dari tampilan antarmuka (user interface) yang rapi, mudah dipahami, dan nyaman digunakan. Oleh karena itu, kemampuan seorang pengembang dalam menyusun tampilan UI menjadi aspek penting dalam proses pengembangan aplikasi mobile.

    Flutter, sebagai framework pengembangan aplikasi lintas platform, menyediakan berbagai widget layouting yang memudahkan pengembang dalam menyusun komponen-komponen UI secara sistematis. Beberapa widget utama yang sering digunakan antara lain Row untuk penataan elemen secara horizontal, Column untuk penataan elemen secara vertikal, Container untuk pembungkus elemen dengan pengaturan padding, margin, dan warna, serta ListTile untuk membuat baris daftar secara instan sesuai standar Material Design. Dengan memahami dan menguasai widget-widget ini, pengembang dapat menyusun halaman aplikasi yang terstruktur dan profesional.

    Pada praktikum kali ini, mahasiswa akan mempraktikkan penggunaan widget-widget layouting tersebut untuk menyusun halaman dashboard pada aplikasi Expense Tracker. Komponen dari Modul 1, yaitu sapaan pengguna dan kartu saldo, akan digabungkan dengan komponen baru Modul 2 berupa tombol aksi dan daftar transaksi terakhir. Seluruh komponen kemudian dibungkus dengan SingleChildScrollView agar halaman dapat di-scroll dengan lancar tanpa terjadi overflow, sehingga menghasilkan tampilan dashboard yang fungsional dan terintegrasi.

  2. Tujuan

    • Menerapkan widget Row untuk menyusun tombol aksi (Pemasukan, Pengeluaran, dan Transfer) secara horizontal dengan jarak yang terbagi rata menggunakan mainAxisAlignment.
    • Menerapkan widget Column untuk menyusun daftar transaksi secara vertikal serta menumpuk teks judul dan komponen lainnya dalam satu kolom.
    • Mengatur tampilan elemen menggunakan Container, Card, dan ListTile dengan pengaturan padding, margin, warna, serta border radius agar tampilan komponen lebih rapi dan sesuai standar Material Design.
    • Menggabungkan seluruh komponen dari Modul 1 dan Modul 2 ke dalam satu halaman dashboard dengan membungkusnya menggunakan SingleChildScrollView agar halaman dapat di-scroll tanpa terjadi overflow.
  3. Alat atau Tools yang Dipakai

    • Flutter SDK
    • Dart Programming Language
    • Android Studio / Visual Studio Code
    • Android Emulator / iOS Simulator
    • Git & GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses implementasi widget layouting Flutter untuk membangun halaman dashboard Expense Tracker. Tahapan pengerjaan dimulai dari pembuatan root widget, layout dasar, komponen sapaan, kartu saldo, tombol aksi, hingga daftar transaksi terakhir.

    📱 Expense Tracker Dashboard

    dashboard_screen.dart

    a. Widget MyApp sebagai Root Aplikasi

    Langkah pertama adalah membuat widget utama sebagai root aplikasi. Widget ini menggunakan StatelessWidget karena tidak memerlukan perubahan state. Di dalam widget MyApp, dikonfigurasi MaterialApp sebagai wrapper aplikasi dengan tema berwarna biru dan menghilangkan banner debug.

    Screenshot MyApp
    Widget MyApp sebagai root aplikasi
    b. DashboardScreen dengan SingleChildScrollView

    Selanjutnya, dibuat halaman utama DashboardScreen yang berfungsi sebagai container untuk seluruh komponen aplikasi. Halaman ini menggunakan Scaffold sebagai struktur dasar dengan AppBar di bagian atas. Agar halaman dapat di-scroll ketika konten melebihi tinggi layar, seluruh body dibungkus dengan SingleChildScrollView. Di dalamnya terdapat Padding untuk memberi jarak dari tepi layar, kemudian Column untuk menyusun widget-widget secara vertikal.

    Screenshot DashboardScreen
    DashboardScreen dengan SingleChildScrollView
    c. GreetingWidget dengan Row

    Lalu dibuat komponen sapaan pengguna menggunakan StatelessWidget. Widget ini menampilkan avatar pengguna dan teks sapaan. Layout disusun menggunakan Row agar avatar dan teks berada dalam satu baris horizontal. Avatar dibuat dengan CircleAvatar berisi ikon person, sedangkan teks sapaan disusun vertikal menggunakan Column dengan dua baris teks: nama pengguna dan kalimat sambutan.

    Screenshot GreetingWidget
    GreetingWidget dengan Row untuk layout horizontal
    d. BalanceCardWidget dengan Toggle Visibility

    Kemudian dibuat komponen kartu saldo menggunakan StatefulWidget karena memerlukan state untuk mengatur visibilitas saldo. Di dalam state class, terdapat variabel boolean _isBalanceVisible yang mengontrol apakah saldo ditampilkan atau disembunyikan. Fungsi _toggleVisibility() menggunakan setState() untuk memperbarui state ketika tombol visibility ditekan. Tampilan kartu menggunakan widget Card dengan elevasi dan border radius untuk efek bayangan. Layout internal menggunakan Column dan Row untuk menyusun label, tombol toggle, dan nominal saldo.

    Screenshot BalanceCardWidget
    BalanceCardWidget dengan toggle visibility
    e. Tombol Aksi dengan Row.spaceEvenly

    Berikutnya dibuat widget tombol aksi yang menampilkan tiga tombol: Pemasukan, Pengeluaran, dan Transfer. Widget ini menggunakan Row dengan mainAxisAlignment.spaceEvenly agar jarak antar tombol terbagi rata secara horizontal. Untuk menghindari pengulangan kode, dibuat fungsi helper _buildActionButton() yang menerima parameter ikon, label, dan warna. Setiap tombol disusun vertikal menggunakan Column, berisi Container dengan background transparan sebagai wadah ikon, dan Text sebagai label tombol.

    Screenshot Tombol Aksi
    Tombol aksi dengan Row.spaceEvenly
    f. Daftar Transaksi dengan ListTile

    Terakhir, dibuat widget untuk menampilkan daftar transaksi terakhir. Widget ini menggunakan Column untuk menyusun judul dan daftar transaksi secara vertikal. Judul "Transaksi Terakhir" diberi style bold dengan ukuran font 18. Daftar transaksi dibungkus dengan Card untuk memberikan efek bayangan dan bingkai. Di dalam Card, terdapat beberapa ListTile yang masing-masing merepresentasikan satu item transaksi. Setiap ListTile memiliki tiga komponen utama: leading berupa CircleAvatar dengan ikon, title dan subtitle untuk nama dan tanggal transaksi, serta trailing untuk menampilkan nominal dengan warna sesuai jenis transaksi. Antar item transaksi dipisahkan dengan Divider.

    Screenshot Daftar Transaksi
    Daftar transaksi dengan ListTile
  5. Tugas Praktikum

    Pada bagian ini diberikan dua tugas latihan untuk memperdalam pemahaman tentang styling dan penambahan data pada komponen daftar transaksi.

    📝 Tugas 1: Styling Warna Trailing Text

    Ubah warna nominal transaksi berdasarkan jenis (merah untuk pengeluaran, hijau untuk pemasukan)

    Implementasi Warna Hijau untuk Pemasukan

    Untuk transaksi pemasukan seperti "Gaji Bulanan" dan "Bonus Proyek", diberikan style dengan warna hijau untuk menunjukkan arus uang masuk. Pada properti trailing, widget Text menggunakan TextStyle dengan color: Colors.green dan fontWeight: FontWeight.bold agar nominal terlihat jelas.

    Screenshot warna hijau pemasukan
    Implementasi warna hijau untuk transaksi pemasukan
    Implementasi Warna Merah untuk Pengeluaran

    Sementara itu, untuk transaksi pengeluaran seperti "Makan Siang", "Isi Bensin", dan "Belanja Bulanan", diberikan style dengan warna merah untuk menunjukkan arus uang keluar. Pada properti trailing, widget Text menggunakan TextStyle dengan color: Colors.red dan fontWeight: FontWeight.bold.

    Screenshot warna merah pengeluaran
    Implementasi warna merah untuk transaksi pengeluaran

    📝 Tugas 2: Menambahkan Transaksi Baru

    Tambahkan dua transaksi fiktif baru ke dalam daftar "Transaksi Terakhir"

    Transaksi Keempat: Belanja Bulanan

    Transaksi pertama yang ditambahkan adalah "Belanja Bulanan" yang merupakan transaksi pengeluaran. Item ini disisipkan setelah transaksi "Isi Bensin" dengan menambahkan Divider terlebih dahulu sebagai pemisah. ListTile ini memiliki leading berupa CircleAvatar dengan background warna orange dan ikon shopping_bag, title dengan teks "Belanja Bulanan", subtitle dengan tanggal "15 Sep 2026", dan trailing menampilkan nominal "- Rp 350.000" dengan warna merah untuk menunjukkan pengeluaran.

    Screenshot Belanja Bulanan
    Penambahan transaksi Belanja Bulanan
    Transaksi Kelima: Bonus Proyek

    Transaksi kedua yang ditambahkan adalah "Bonus Proyek" yang merupakan transaksi pemasukan. Item ini disisipkan setelah transaksi "Belanja Bulanan" dengan menambahkan Divider terlebih dahulu. ListTile ini memiliki leading berupa CircleAvatar dengan background warna hijau dan ikon card_giftcard, title dengan teks "Bonus Proyek", subtitle dengan tanggal "18 Sep 2026", dan trailing menampilkan nominal "+ Rp 1.500.000" dengan warna hijau untuk menunjukkan pemasukan.

    Screenshot Bonus Proyek
    Penambahan transaksi Bonus Proyek
    Verifikasi Hasil Tugas

    Jalankan program nya, dan lihat hasil dari tugas apakah sudah terpenuhi dengan memastikan kedua transaksi baru tampil dengan benar di daftar transaksi beserta styling warna yang sesuai.

    Screenshot hasil akhir
    Hasil akhir dashboard Expense Tracker
  6. Kesimpulan

    Dari praktikum ini dapat disimpulkan bahwa Flutter menyediakan berbagai widget layouting yang efektif dan mudah digunakan untuk menyusun antarmuka pengguna aplikasi mobile. Widget Row dan Column memungkinkan pengembang menyusun elemen secara horizontal dan vertikal dengan kendali yang presisi melalui properti seperti mainAxisAlignment, crossAxisAlignment, dan SizedBox. Penggunaan Container dan Card memberikan kemampuan untuk mengatur tampilan visual seperti padding, margin, warna, dan efek bayangan, sehingga menghasilkan komponen yang rapi dan menarik.

    Widget ListTile terbukti sangat efisien untuk membuat daftar item dengan struktur standar Material Design, yang terdiri dari elemen leading, title, subtitle, dan trailing. Dengan menggabungkan beberapa widget ini secara terstruktur, berhasil dibuat halaman dashboard yang fungsional dengan komponen sapaan pengguna, kartu saldo dengan fitur toggle visibility, tombol aksi yang tersusun horizontal, dan daftar transaksi yang tersusun vertikal.

    Penerapan SingleChildScrollView terbukti efektif dalam menangani masalah overflow dengan memungkinkan halaman dapat di-scroll secara lancar ketika konten melebihi tinggi layar. Selain itu, tampilan visual dapat ditingkatkan dengan penerapan styling warna pada trailing text untuk membedakan jenis transaksi—merah untuk pengeluaran dan hijau untuk pemasukan—sehingga meningkatkan keterbacaan dan user experience.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Aplikasi Mobile

Flutter Input Widgets dan Forms: Expense Tracker

Implementasi widget input dan forms di Flutter untuk aplikasi pencatat transaksi keuangan mencakup TextFormField, DropdownButtonFormField, showDatePicker, GlobalKey, dan validasi form.

  1. Pendahuluan

    Aplikasi mobile menjadi bagian integral dalam kehidupan sehari-hari modern. Salah satu aspek penting dalam pengembangan aplikasi mobile adalah kemampuan untuk menangkap dan memproses input dari pengguna. Input dari pengguna merupakan fondasi interaksi antara aplikasi dan pengguna (user interface), sehingga penggunaan widget input yang tepat sangat memengaruhi kualitas aplikasi yang dibangun.

    Flutter adalah framework open-source yang dikembangkan oleh Google untuk membangun aplikasi mobile multi-platform dengan performa tinggi. Flutter menyediakan berbagai widget bawaan yang memudahkan pengembang dalam membuat form dan menangkap input dari pengguna. Pada praktikum kali ini, kita mempelajari Input Widgets dan Forms di Flutter, yang mencakup penggunaan TextFormField, DropdownButtonFormField, serta implementasi validasi input untuk memastikan data yang dimasukkan sesuai dengan format yang diharapkan.

    Dalam praktikum ini, kita akan membangun sebuah aplikasi sederhana bernama Expense Tracker yang berfungsi untuk mencatat transaksi keuangan. Aplikasi ini akan mengimplementasikan form input dengan beberapa field seperti judul transaksi, nominal uang, dan kategori pengeluaran. Melalui praktikum ini, diharapkan mahasiswa dapat memahami konsep input widgets, form validation, dan state management di Flutter secara lebih mendalam.

  2. Tujuan

    • Mengimplementasikan widget input dengan controller, khususnya penggunaan TextFormField dengan TextEditingController untuk menangkap dan memproses input teks dari pengguna secara efektif.
    • Mengimplementasikan widget dropdown statis, dengan menggunakan DropdownButtonFormField untuk menyediakan pilihan kategori transaksi dan mengelola state perubahan pilihan tersebut.
    • Menerapkan sistem validasi input, baik untuk input teks biasa maupun input numerik, guna mencegah data kosong, format tidak valid, atau input yang tidak sesuai dengan persyaratan sistem sebelum disimpan.
    • Membuat form yang terstruktur dengan validasi otomatis, meliputi pengelolaan form menggunakan GlobalKey<FormState>, pengelompokan input dalam widget Form, serta menampilkan feedback visual berupa SnackBar ketika data berhasil disimpan.
  3. Langkah pengerjaan

    📄 Main.dart

    File entry point aplikasi

    a. Import Library dan Entry Point
    File main.dart sebagai titik awal aplikasi
    File main.dart sebagai titik awal aplikasi

    Langkah pertama, kita menyiapkan file main.dart sebagai titik awal (entry point) aplikasi. Kita mengimpor library material yang berisi widget-widget dasar Flutter, serta file add_transaction_screen.dart yang berisi halaman form transaksi yang akan kita buat.

    b. Fungsi main()

    Selanjutnya, kita membuat fungsi main() sebagai fungsi utama yang pertama kali dijalankan. Fungsi ini memanggil runApp() untuk menjalankan aplikasi Flutter dengan widget MyApp di dalamnya.

    Fungsi main() sebagai entry point aplikasi
    Fungsi main() sebagai entry point aplikasi
    c. Class MyApp

    Kita membuat class MyApp yang merupakan StatelessWidget sebagai root dari aplikasi. Di dalamnya terdapat MaterialApp yang berisi pengaturan tema dengan warna dasar Colors.deepPurple sesuai tema Modul 3, serta home yang langsung mengarahkan aplikasi membuka halaman AddTransactionScreen.

    Class MyApp sebagai root widget aplikasi
    Class MyApp sebagai root widget aplikasi

    📄 add_transaction_screen.dart

    Halaman form transaksi

    a. StatefulWidget
    Halaman form transaksi menggunakan StatefulWidget
    Halaman form transaksi menggunakan StatefulWidget

    Halaman form transaksi dibuat menggunakan StatefulWidget karena isi formulir (teks dan dropdown) akan terus berubah saat pengguna mengetik, sehingga membutuhkan state yang bisa diperbarui. Di sinilah kita mengelola seluruh logika form transaksi.

    b. Persiapan GlobalKey dan Controller

    Sebelum membangun tampilan, kita menyiapkan beberapa hal penting. Pertama, GlobalKey<FormState> yang digunakan untuk mengontrol dan memicu validasi seluruh form. Kedua, TextEditingController untuk judul dan nominal yang berfungsi menangkap teks dari input pengguna. Ketiga, variabel state untuk dropdown beserta daftar kategorinya.

    Deklarasi GlobalKey, TextEditingController, dan state dropdown
    Deklarasi GlobalKey, TextEditingController, dan state dropdown
    c. Method dispose()

    Agar tidak terjadi kebocoran memori (memory leak), kedua controller dibersihkan menggunakan metode dispose() saat halaman ditutup.

    Method dispose() untuk membersihkan controller
    Method dispose() untuk membersihkan controller
    d. Scaffold dan AppBar
    Struktur Scaffold dengan AppBar Deep Purple
    Struktur Scaffold dengan AppBar Deep Purple

    Kita membangun tampilan halaman dengan Scaffold dan AppBar berjudul "Catat Transaksi Baru". Body dibungkus SingleChildScrollView agar tidak terjadi error layout saat keyboard muncul, kemudian seluruh kolom input dibungkus dengan widget Form yang terhubung dengan _formKey untuk keperluan validasi.

    e. TextFormField untuk Judul
    Implementasi TextFormField dengan validator
    Implementasi TextFormField dengan validator

    Kita membuat input pertama yaitu TextFormField untuk judul transaksi. Field ini dihubungkan dengan _titleController agar teks yang diketik bisa ditangkap. Selain itu, diberikan validator yang merupakan inti dari sistem validasi: jika nilai kosong, fungsi mengembalikan pesan error "Judul transaksi tidak boleh kosong", sebaliknya jika terisi, mengembalikan null yang berarti data valid.

    f. TextFormField untuk Nominal
    Input nominal dengan keyboardType.number
    Input nominal dengan keyboardType.number

    Selanjutnya, input untuk nominal uang. Field ini menggunakan keyboardType: TextInputType.number sehingga keyboard yang muncul khusus angka, mempermudah pengguna saat mengisi nominal. Validatornya memastikan field tidak boleh kosong dan hanya menerima input berupa angka.

    g. DropdownButtonFormField
    Implementasi DropdownButtonFormField
    Implementasi DropdownButtonFormField

    Kemudian kita membuat DropdownButtonFormField<String> untuk pilihan kategori. Daftar _categories dipetakan menjadi DropdownMenuItem sebagai pilihan yang tampil. Saat pengguna memilih kategori lain, onChanged akan memperbarui state _selectedCategory menggunakan setState().

    h. Tombol Submit
    Tombol submit dengan validasi form
    Tombol submit dengan validasi form

    Terakhir, kita membuat tombol ElevatedButton "Simpan Transaksi". Tombol ini menjadi pengeksekusi validasi keseluruhan form melalui _formKey.currentState!.validate(). Jika semua field lolos validasi, muncul SnackBar hijau berisi ringkasan transaksi yang tersimpan. Jika ada field yang kosong atau tidak valid, aplikasi otomatis menampilkan pesan error merah di bawah field yang bermasalah.

    i. Hasil Running
    Tampilan aplikasi Expense Tracker
    Tampilan aplikasi Expense Tracker

    Jalankan program nya pada main.dart dan akan tampil seperti ini

  4. Tugas Praktikum

    📄 add_transaction_screen.dart

    Implementasi lengkap dengan date picker

    a. Class AddTransactionScreen sebagai StatefulWidget

    Class AddTransactionScreen dibuat sebagai StatefulWidget karena form memerlukan perubahan state saat user berinteraksi dengannya, seperti mengetik teks pada input field, memilih opsi dari dropdown, atau memilih tanggal dari date picker. Widget ini memiliki state yang berubah-ubahan sehingga dibuat sebagai StatefulWidget, dan method createState() digunakan untuk membuat instance dari state class _AddTransactionScreenState yang berisi logic dan UI dari form.

    Class AddTransactionScreen sebagai StatefulWidget
    Class AddTransactionScreen sebagai StatefulWidget
    b. Deklarasi GlobalKey dan Controllers

    Di dalam state class _AddTransactionScreenState, beberapa komponen penting disiapkan. GlobalKey<FormState> dibuat sebagai _formKey untuk mengakses state form dan memicu validasi ketika tombol submit ditekan. TextEditingController untuk _titleController, _amountController, dan _dateController digunakan untuk mengambil nilai input yang diketik user pada masing-masing field. Variabel _selectedCategory digunakan untuk menyimpan pilihan kategori yang dipilih dari dropdown, dengan nilai default 'Makanan', dan _categories adalah list yang berisi semua opsi kategori yang tersedia di dropdown yaitu Makanan, Transportasi, Hiburan, dan Lainnya.

    Deklarasi GlobalKey, TextEditingController, dan daftar kategori
    Deklarasi GlobalKey, TextEditingController, dan daftar kategori
    c. Method dispose()

    Method dispose() dipanggil secara otomatis saat widget dihancurkan, seperti saat user meninggalkan halaman. Dengan memanggil .dispose() pada setiap controller, memory yang digunakan oleh controller dibebaskan sehingga tidak terjadi memory leak yang dapat memengaruhi kinerja aplikasi.

    Method dispose() untuk membersihkan controller
    Method dispose() untuk membersihkan controller
    d. Scaffold dan AppBar
    Struktur Scaffold pada method build()
    Struktur Scaffold pada method build()

    Pada method build(), struktur halaman dibuat menggunakan Scaffold yang menyediakan kerangka dasar Material Design. Bagian AppBar ditempatkan di bagian atas halaman dengan judul 'Catat Transaksi Baru', background warna Deep Purple, dan teks berwarna putih. Tampilan AppBar ini memberikan identitas visual yang konsisten dengan tema aplikasi dan memberikan informasi jelas tentang fungsi halaman kepada user.

    e. SingleChildScrollView dan Form

    SingleChildScrollView digunakan sebagai wrapper agar konten bisa di-scroll jika ukurannya melebihi tinggi layar, terutama saat keyboard muncul dan memenuhi sebagian layar. Form adalah widget wrapper yang menghubungkan semua input field dan memungkinkan penggunaan validasi secara keseluruhan. Key pada Form diisi dengan _formKey agar bisa dipicu validasinya nanti. Column digunakan untuk mengatur layout vertikal dengan crossAxisAlignment: CrossAxisAlignment.stretch agar semua child memiliki lebar yang sama dengan lebar layar.

    SingleChildScrollView, Form, dan Column sebagai kerangka layout
    SingleChildScrollView, Form, dan Column sebagai kerangka layout
    f. TextFormField untuk Judul
    TextFormField judul transaksi
    TextFormField judul transaksi

    TextFormField untuk input judul menggunakan _titleController untuk mengambil nilai input. Tampilan input diatur melalui decoration yang mencakup label text, hint text dengan contoh pengisian, dan icon title di awal input. Validasi diterapkan di validator dengan memeriksa apakah nilai yang dimasukkan null atau kosong. Jika kosong, pesan error 'Judul transaksi tidak boleh kosong' akan ditampilkan, sedangkan jika ada isinya, validator mengembalikan null yang berarti input valid.

    g. TextFormField untuk Nominal
    Input nominal uang
    Input nominal uang

    Input nominal menggunakan _amountController dan keyboardType: TextInputType.number yang membuat keyboard yang muncul saat user mengklik field ini adalah numeric keyboard agar user hanya bisa memasukkan angka. Tampilan diatur dengan label, hint text, dan icon uang untuk memperjelas fungsi field. Validator memeriksa apakah field kosong dan menampilkan pesan error jika belum diisi.

    h. DropdownButtonFormField untuk Kategori
    Dropdown kategori transaksi
    Dropdown kategori transaksi

    DropdownButtonFormField memungkankan user memilih salah satu kategori dari daftar yang tersedia. value menampilkan kategori yang saat ini dipilih. Tampilan dropdown diatur dengan label text dan border menggunakan OutlineInputBorder. items diisi dengan hasil mapping dari _categories list menjadi DropdownMenuItem agar bisa ditampilkan dalam dropdown. Ketika user memilih opsi baru, onChanged dipanggil dan setState() digunakan untuk update nilai _selectedCategory sehingga tampilan dropdown berubah sesuai pilihan user.

    i. Input Tanggal dengan Date Picker
    Input tanggal dengan date picker
    Input tanggal dengan date picker

    Input tanggal dibuat dengan readOnly: true agar user tidak bisa mengetik manual, melainkan harus memilih dari date picker. Tampilan input menggunakan label, hint text, dan icon kalender. suffixIcon berisi IconButton dengan icon tambah untuk membuka dialog date picker. Ketika tombol ditekan, showDatePicker() dipanggil secara async dengan tanggal saat ini sebagai nilai awal, rentang tanggal dari tahun 2000 hingga hari ini, dan jika user memilih tanggal, nilai tersebut diformat menjadi format DD/MM/YYYY menggunakan padLeft(2, '0') untuk memastikan angka dua digit, lalu disimpan ke _dateController dengan setState(). Validator memeriksa apakah field kosong.

    j. Tombol Submit dengan SnackBar
    SnackBar feedback setelah submit
    SnackBar feedback setelah submit

    Tombol ElevatedButton digunakan untuk submit form. Ketika ditekan, onPressed dipanggil dan _formKey.currentState!.validate() digunakan untuk memicu validasi semua field dalam form sekaligus. Jika semua field valid (validator tidak mengembalikan pesan error), maka ScaffoldMessenger.of(context).showSnackBar() dipanggil untuk menampilkan SnackBar di bagian bawah layar dengan background hijau sebagai indikator keberhasilan. SnackBar menampilkan ringkasan data yang telah diinput oleh user yaitu judul, nominal, dan tanggal transaksi.

    k. Hasil Running
    Tampilan aplikasi tugas praktikum
    Tampilan aplikasi tugas praktikum

    Jalankan program nya

  5. Kesimpulan

    Melalui pembuatan aplikasi Expense Tracker, mahasiswa telah berhasil memahami konsep dasar input widgets dan forms di Flutter, mulai dari penggunaan TextFormField dengan TextEditingController, widget dropdown menggunakan DropdownButtonFormField, hingga sistem validasi input yang memastikan data tidak kosong atau tidak valid. Proses pembuatan aplikasi ini menunjukkan bagaimana menggabungkan beberapa widget Flutter menjadi satu form yang terstruktur dan user-friendly.

    Pembuatan aplikasi ini juga melibatkan pengelolaan state menggunakan StatefulWidget, implementasi GlobalKey<FormState>, serta fungsi dispose() untuk membersihkan controller. Selain itu, penambahan fitur showDatePicker membuat aplikasi semakin lengkap dalam menangkap data transaksi keuangan. Dengan aplikasi ini, diharapkan mahasiswa dapat mengaplikasikan pengetahuan yang telah dipelajari dalam membuat aplikasi mobile yang lebih kompleks di masa mendatang.

    Secara keseluruhan, praktikum ini memberikan pemahaman yang lebih mendalam tentang bagaimana membangun form input yang baik di Flutter. Meskipun masih ada ruang untuk pengembangan lebih lanjut, hasil yang diperoleh sudah sangat memuaskan dan sesuai dengan tujuan pembelajaran.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Aplikasi Mobile

Flutter Navigation & Passing Data: Expense Tracker Multi-Screen

Implementasi navigasi antarhalaman menggunakan Navigator.push dan Navigator.pop dengan konsep stack, serta passing data melalui constructor pada aplikasi Expense Tracker yang terdiri dari dashboard, form transaksi, dan halaman detail.

  1. Pendahuluan

    Pengembangan aplikasi mobile tidak hanya membutuhkan tampilan antarmuka yang baik, tetapi juga pengelolaan perpindahan antarhalaman dan pertukaran data yang tepat. Dalam Flutter, navigasi antarlayar dikelola menggunakan Navigator yang bekerja dengan konsep stack, di mana halaman baru ditambahkan menggunakan Navigator.push dan halaman teratas dapat ditutup menggunakan Navigator.pop. Konsep tersebut menjadi dasar dalam membangun alur interaksi aplikasi agar pengguna dapat berpindah dari satu halaman ke halaman lainnya secara terstruktur.

    Pada praktikum ini, konsep navigasi diterapkan pada aplikasi Expense Tracker yang terdiri dari halaman dashboard, form pencatatan transaksi, dan halaman detail transaksi. Dashboard digunakan sebagai halaman utama yang dapat membuka form penambahan transaksi melalui Navigator.push, sedangkan setiap transaksi pada daftar dapat dipilih untuk membuka halaman detail dengan mengirimkan data melalui constructor. Data seperti judul, nominal, kategori, dan tanggal diteruskan ke TransactionDetailScreen menggunakan parameter required, sehingga informasi transaksi yang dipilih dapat ditampilkan pada halaman berikutnya.

    Penerapan konsep tersebut memberikan pemahaman mengenai bagaimana beberapa halaman dalam aplikasi Flutter saling terhubung melalui navigasi dan bagaimana data dapat diteruskan antarhalaman sesuai kebutuhan. Selain itu, praktikum juga menjadi dasar untuk mengembangkan interaksi aplikasi yang lebih terstruktur melalui penggunaan form input, navigasi kembali, serta penyajian informasi transaksi secara lebih rinci.

  2. Tujuan

    • Menerapkan penggunaan Navigator.push untuk melakukan perpindahan dari satu halaman ke halaman lainnya dalam aplikasi Flutter.
    • Menerapkan Navigator.pop untuk menutup halaman dan mengembalikan pengguna ke halaman sebelumnya setelah suatu proses selesai.
    • Memahami serta menerapkan konsep stack pada navigasi halaman dalam aplikasi Flutter.
    • Menerapkan passing data antarhalaman dengan menggunakan constructor, variabel final, dan parameter required untuk mengirimkan data seperti String dan int.
  3. Alat atau Tools yang Dipakai

    • Flutter SDK
    • Dart Programming Language
    • Android Studio / Visual Studio Code
    • Android Emulator / iOS Simulator
    • Git & GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses implementasi aplikasi Flutter multi-screen dengan navigasi dan passing data. Tahapan pengerjaan dimulai dari pembuatan struktur aplikasi, implementasi dashboard, form transaksi, hingga halaman detail dengan passing data.

    📁 Main.dart

    File utama aplikasi Flutter

    1. Pertama - Import library & main()

    Pertama, buat dan siapkan file main.dart sebagai file utama untuk menjalankan aplikasi Flutter. Pada tahap ini, program mengimpor library material.dart untuk menyediakan komponen antarmuka Flutter dan dashboard_screen.dart agar halaman dashboard dapat digunakan sebagai halaman awal aplikasi. Selanjutnya, fungsi main() menjalankan aplikasi dengan memanggil runApp(const MyApp()).

    2. Selanjutnya - Class MyApp & MaterialApp

    Selanjutnya, buat class MyApp sebagai StatelessWidget yang bertugas membangun konfigurasi utama aplikasi. Di dalam MaterialApp, debugShowCheckedModeBanner diatur menjadi false sehingga label debug tidak ditampilkan, sedangkan title menetapkan nama aplikasi sebagai Expense Tracker - Modul 4. Tema aplikasi menggunakan ThemeData dengan primarySwatch berwarna merah agar komponen utama memiliki tema warna yang sesuai dengan implementasi praktikum.

    3. Kemudian - DashboardScreen sebagai home

    Kemudian, tentukan DashboardScreen sebagai nilai home melalui const DashboardScreen(). Pengaturan ini menjadikan dashboard sebagai halaman pertama yang dimuat ketika aplikasi dijalankan. Setelah halaman tersebut tampil, proses navigasi ke halaman lain dilakukan dari dashboard sesuai dengan alur yang diterapkan pada program.

    DashboardScreen sebagai home page
    DashboardScreen sebagai home page

    📁 dashboard_screen.dart

    Halaman utama aplikasi dengan navigasi

    1. Selanjutnya - Import & class DashboardScreen

    Selanjutnya, buat file dashboard_screen.dart sebagai halaman utama aplikasi. Pada bagian awal, program mengimpor material.dart untuk menggunakan komponen Flutter, kemudian mengimpor add_transaction_screen.dart dan transaction_detail_screen.dart karena dashboard akan digunakan untuk berpindah ke halaman pencatatan transaksi dan halaman detail transaksi. Class DashboardScreen dibuat sebagai StatelessWidget, sehingga halaman ini tidak memiliki state yang berubah secara langsung.

    Import library dan class DashboardScreen
    Import library dan class DashboardScreen
    2. Kemudian - Scaffold, AppBar, FloatingActionButton

    Kemudian, buat struktur tampilan utama menggunakan Scaffold yang terdiri dari AppBar, FloatingActionButton, dan body. AppBar menampilkan judul "Dashboard Keuangan" dengan tema warna merah dan teks putih. Pada bagian body, digunakan SingleChildScrollView dan Column untuk menyusun sapaan pengguna, kartu saldo, serta bagian daftar transaksi secara vertikal.

    3. Setelah itu - FloatingActionButton Navigator.push

    Setelah itu, tambahkan FloatingActionButton sebagai tombol untuk menambahkan transaksi. Ketika tombol ditekan, program menjalankan Navigator.push dengan MaterialPageRoute untuk membuka AddTransactionScreen. Dengan demikian, halaman form dapat ditambahkan ke dalam stack navigasi dari dashboard.

    4. Selanjutnya - Method _buildBalanceCard()

    Selanjutnya, buat method _buildBalanceCard() untuk menampilkan informasi saldo utama. Widget ini menggunakan Card dengan warna Colors.redAccent dan menampilkan teks "Saldo Utama" serta nominal "Rp 5.000.000". Method tersebut kemudian dipanggil pada bagian body dashboard untuk menampilkan kartu saldo.

    Method _buildBalanceCard() untuk menampilkan saldo
    Method _buildBalanceCard() untuk menampilkan saldo
    5. Berikutnya - Method _buildTransactionList "Makan Siang"

    Berikutnya, buat method _buildTransactionList(BuildContext context) untuk menampilkan daftar transaksi yang dapat dipilih oleh pengguna. Pada transaksi "Makan Siang", ListTile memiliki onTap yang menjalankan Navigator.push untuk membuka TransactionDetailScreen. Data title, amount, category, dan date dikirim melalui constructor sesuai dengan transaksi yang dipilih.

    Method _buildTransactionList dengan transaksi Makan Siang
    Method _buildTransactionList dengan transaksi "Makan Siang"
    6. Kemudian - Transaksi "Gaji Bulanan"

    Kemudian, tambahkan transaksi kedua yaitu "Gaji Bulanan" dengan mekanisme navigasi yang sama. Saat transaksi dipilih, program kembali menggunakan Navigator.push dan mengirimkan data transaksi melalui TransactionDetailScreen, yaitu judul "Gaji Bulanan", nominal "Rp 5.000.000", kategori "Pemasukan", dan tanggal "1 September 2026". Dengan demikian, setiap transaksi pada dashboard dapat membuka halaman detail dengan data yang sesuai dengan baris yang dipilih.

    Penambahan transaksi Gaji Bulanan
    Penambahan transaksi "Gaji Bulanan"
    7. Terakhir - Kesimpulan alur navigasi

    Terakhir, alur pada dashboard_screen.dart menghubungkan halaman utama dengan dua halaman lainnya. Tombol tambah transaksi mengarahkan pengguna ke AddTransactionScreen, sedangkan pemilihan transaksi mengarahkan pengguna ke TransactionDetailScreen sekaligus membawa data transaksi melalui constructor. Hal ini menunjukkan penerapan navigasi dan passing data yang menjadi fokus utama praktikum.

    📁 add_transaction_screen.dart

    Form input transaksi

    1. Selanjutnya - StatefulWidget & controller

    Selanjutnya, buat file add_transaction_screen.dart sebagai halaman untuk mencatat transaksi baru. Pada file ini, program menggunakan StatefulWidget karena halaman memiliki data input yang dikelola melalui controller. Terdapat _formKey untuk mengelola validasi form, _titleController untuk menampung input judul transaksi, dan _amountController untuk menampung input nominal transaksi.

    StatefulWidget dengan _formKey dan controller
    StatefulWidget dengan _formKey dan controller
    2. Kemudian - Scaffold & AppBar

    Kemudian, buat struktur tampilan halaman menggunakan Scaffold dan AppBar. AppBar menampilkan judul "Catat Transaksi" dengan latar belakang berwarna merah dan teks berwarna putih. Bagian isi menggunakan Padding dan Form, dengan _formKey sebagai kunci untuk mengatur proses validasi seluruh input yang terdapat di dalam form.

    3. Setelah itu - Input Judul

    Setelah itu, tambahkan TextFormField pertama untuk menerima input judul transaksi. Field tersebut menggunakan _titleController sebagai penampung data dan memiliki validasi yang memeriksa apakah nilai input kosong. Apabila kosong, validator akan menampilkan pesan "Tidak boleh kosong" sehingga pengguna diwajibkan mengisi judul sebelum transaksi dapat disimpan.

    4. Selanjutnya - Input Nominal

    Selanjutnya, tambahkan TextFormField kedua untuk menerima input nominal transaksi. Field nominal menggunakan _amountController dan TextInputType.number sehingga input diarahkan untuk memasukkan data berupa angka. Sama seperti judul, field nominal memiliki validasi wajib diisi dengan pesan "Tidak boleh kosong" ketika input tidak diberikan.

    5. Kemudian - ElevatedButton "Simpan"

    Kemudian, tambahkan tombol ElevatedButton dengan label "Simpan" untuk menjalankan proses penyimpanan transaksi. Ketika tombol ditekan, program memanggil _formKey.currentState!.validate() untuk memeriksa seluruh aturan validasi pada form. Apabila validasi berhasil, program menampilkan SnackBar dengan pesan "Transaksi Berhasil Disimpan!" sebagai pemberitahuan kepada pengguna.

    6. Terakhir - Navigator.pop()

    Terakhir, setelah validasi berhasil dan pesan berhasil ditampilkan, program menjalankan Navigator.pop(context). Perintah ini menutup halaman form dan mengembalikan pengguna ke halaman sebelumnya, yaitu DashboardScreen. Penerapan tersebut merupakan penggunaan Navigator.pop untuk kembali dari halaman yang sebelumnya dibuka menggunakan Navigator.push.

    📁 transaction_detail_screen.dart

    Halaman detail transaksi dengan passing data

    1. Selanjutnya - Import & class TransactionDetailScreen

    Selanjutnya, buat file transaction_detail_screen.dart sebagai halaman yang bertugas menampilkan informasi detail transaksi. Pada tahap awal, program mengimpor material.dart agar komponen antarmuka Flutter dapat digunakan. Kemudian dibuat class TransactionDetailScreen yang merupakan StatelessWidget karena data transaksi diterima dari halaman sebelumnya dan digunakan untuk ditampilkan.

    Import library dan class TransactionDetailScreen
    Import library dan class TransactionDetailScreen
    2. Kemudian - Variabel final

    Kemudian, deklarasikan variabel final untuk menampung data transaksi yang dikirim dari DashboardScreen. Variabel yang digunakan terdiri dari title untuk judul transaksi, amount untuk nominal, category untuk kategori, dan date untuk tanggal transaksi. Penggunaan final sesuai dengan karakteristik StatelessWidget, karena nilai tersebut diterima melalui constructor dan tidak diubah selama halaman ditampilkan.

    Deklarasi variabel final untuk data transaksi
    Deklarasi variabel final untuk data transaksi
    3. Setelah itu - Constructor required

    Setelah itu, buat constructor TransactionDetailScreen dengan parameter required untuk memastikan seluruh data transaksi wajib dikirim ketika halaman detail dibuat. Constructor menerima title, amount, category, dan date, sehingga halaman detail dapat memperoleh informasi yang sesuai dengan transaksi yang dipilih pada dashboard.

    Constructor dengan parameter required
    Constructor dengan parameter required
    4. Selanjutnya - Scaffold & AppBar

    Selanjutnya, bangun tampilan halaman detail menggunakan Scaffold dan AppBar. AppBar diberi judul "Detail Transaksi", menggunakan warna merah sebagai latar belakang dan warna putih pada teks maupun elemen navigasinya. Hal ini membuat tampilan halaman detail tetap konsisten dengan halaman dashboard dan form transaksi.

    Scaffold dan AppBar untuk detail transaksi
    Scaffold dan AppBar untuk detail transaksi
    5. Kemudian - Body Padding & Column

    Kemudian, tambahkan bagian body untuk menampilkan informasi transaksi secara terstruktur. Padding digunakan untuk memberikan jarak dari tepi layar, sedangkan Column digunakan untuk menyusun komponen detail secara vertikal dan menempatkannya di tengah secara horizontal.

    Body dengan Padding dan Column
    Body dengan Padding dan Column
    6. Setelah itu - Ikon & data utama (title, amount)

    Setelah itu, tampilkan ikon transaksi dan data utama berupa judul serta nominal transaksi. Ikon receipt_long digunakan sebagai representasi visual detail transaksi. Variabel title digunakan untuk menampilkan judul transaksi yang diterima melalui constructor, sedangkan amount digunakan untuk menampilkan nominal transaksi dengan ukuran teks yang lebih besar sehingga menjadi informasi utama pada halaman detail.

    Ikon dan data utama transaksi
    Ikon dan data utama transaksi
    7. Selanjutnya - Divider & informasi tambahan

    Selanjutnya, tambahkan garis pemisah menggunakan Divider dan tampilkan informasi tambahan transaksi. Setelah nominal ditampilkan, Divider digunakan sebagai pemisah antara informasi utama dengan informasi detail. Data kategori ditampilkan melalui _buildDetailRow, kemudian diikuti data tanggal dan status transaksi. Nilai category dan date berasal dari data yang dikirim melalui constructor, sedangkan status ditetapkan secara langsung sebagai "Berhasil".

    Divider dan informasi tambahan
    Divider dan informasi tambahan
    8. Kemudian - Widget _buildDetailRow()

    Kemudian, buat widget pembantu _buildDetailRow() untuk menyusun setiap informasi detail dalam format baris. Method ini menerima dua parameter, yaitu label sebagai nama informasi dan value sebagai nilainya. Keduanya ditempatkan dalam Row dengan MainAxisAlignment.spaceBetween, sehingga label berada di satu sisi dan nilai berada di sisi lainnya. Pendekatan ini digunakan agar tampilan kategori, tanggal, dan status memiliki susunan yang konsisten.

    Widget pembantu _buildDetailRow()
    Widget pembantu _buildDetailRow()
    9. Terakhir - Kesimpulan passing data

    Terakhir, seluruh bagian pada transaction_detail_screen.dart saling terhubung untuk menerima dan menampilkan data transaksi yang dikirim dari dashboard. Ketika pengguna memilih salah satu transaksi, DashboardScreen membuat TransactionDetailScreen dan mengirimkan title, amount, category, serta date melalui constructor. Halaman detail kemudian menggunakan data tersebut untuk menampilkan informasi transaksi yang sesuai. Dengan demikian, file ini menjadi penerapan utama konsep passing data melalui constructor yang dipelajari pada praktikum.

    ▶️ Sekarang jalankan program dan lihat hasil

    Eksekusi aplikasi

    1. Screenshot hasil akhir aplikasi

    Sekarang jalankan program dan lihat hasil yang sudah di buat

    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 1
    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 1
    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 2
    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 2
    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 3
    Hasil akhir aplikasi Expense Tracker multi-screen - Screenshot 3
  5. Tugas Praktikum

    Pada bagian ini dilakukan penambahan fitur input tanggal pada form transaksi menggunakan showDatePicker dengan format DD/MM/YYYY.

    📝 Tugas: add_transaction_screen.dart Enhanced

    Penambahan input tanggal dengan DatePicker

    1. Selanjutnya - StatefulWidget dengan 3 controller

    Selanjutnya, buat file add_transaction_screen.dart sebagai halaman untuk mencatat transaksi baru. Pada tahap ini, program menggunakan StatefulWidget untuk membangun halaman form transaksi. Di dalam state-nya disiapkan _formKey untuk menangani validasi form serta tiga TextEditingController, yaitu _titleController, _amountController, dan _dateController untuk menampung input judul, nominal, dan tanggal transaksi.

    StatefulWidget dengan 3 TextEditingController
    StatefulWidget dengan 3 TextEditingController
    2. Kemudian - Scaffold & AppBar

    Kemudian, bangun struktur utama halaman menggunakan Scaffold dan AppBar. AppBar digunakan untuk menampilkan judul "Catat Transaksi", sedangkan body menggunakan Padding dan Form agar seluruh input dapat dikelompokkan dalam satu form yang dikendalikan oleh _formKey.

    Scaffold dan AppBar untuk form enhanced
    Scaffold dan AppBar untuk form enhanced
    3. Setelah itu - Input Judul

    Setelah itu, tambahkan input Judul untuk menerima nama atau keterangan transaksi. Input menggunakan _titleController sebagai penampung nilai dan dilengkapi validator yang memeriksa apakah field dalam keadaan kosong. Apabila tidak diisi, program menampilkan pesan "Tidak boleh kosong".

    Input Judul dengan validasi
    Input Judul dengan validasi
    4. Selanjutnya - Input Nominal

    Selanjutnya, tambahkan input Nominal untuk menerima jumlah transaksi. _amountController digunakan untuk menampung nilai nominal, sedangkan TextInputType.number mengatur jenis keyboard yang digunakan agar pengguna dapat memasukkan data berupa angka. Field ini juga memiliki validasi wajib diisi.

    Input Nominal dengan TextInputType.number
    Input Nominal dengan TextInputType.number
    5. Kemudian - Input Tanggal (readOnly)

    Kemudian, tambahkan input Tanggal sebagai bagian dari data transaksi. Field tanggal menggunakan _dateController dan diatur dengan readOnly: true, sehingga tanggal tidak diketik secara langsung. Pada bagian decoration, diberikan hintText "DD/MM/YYYY" dan suffixIcon berupa tombol tambah yang digunakan untuk membuka pemilih tanggal.

    Input Tanggal dengan readOnly dan suffixIcon
    Input Tanggal dengan readOnly dan suffixIcon
    6. Setelah itu - showDatePicker

    Setelah itu, gunakan showDatePicker ketika tombol tambah pada field tanggal ditekan. Fungsi tersebut membuka kalender sehingga pengguna dapat memilih tanggal. initialDate menggunakan tanggal saat ini, sedangkan firstDate dan lastDate menentukan rentang tanggal yang dapat dipilih, yaitu dari tahun 2000 sampai 2100.

    showDatePicker untuk pemilihan tanggal
    showDatePicker untuk pemilihan tanggal
    7. Selanjutnya - Format DD/MM/YYYY

    Selanjutnya, periksa apakah pengguna benar-benar memilih tanggal. Apabila selectedDate tidak bernilai null, tanggal tersebut diformat menjadi bentuk DD/MM/YYYY. Fungsi padLeft(2, '0') digunakan agar nilai hari dan bulan selalu terdiri dari dua digit. Setelah format selesai dibuat, setState() digunakan untuk memasukkan hasilnya ke dalam _dateController sehingga tanggal pilihan tampil pada field tanggal.

    Format tanggal DD/MM/YYYY dengan padLeft
    Format tanggal DD/MM/YYYY dengan padLeft
    8. Kemudian - Validasi tanggal

    Kemudian, tambahkan validasi pada input tanggal agar pengguna wajib memilih tanggal sebelum menyimpan transaksi. Validator memeriksa isi _dateController, dan apabila masih kosong akan menampilkan pesan "Tanggal wajib diisi!". Dengan demikian, ketiga data utama pada form, yaitu judul, nominal, dan tanggal, memiliki pemeriksaan sebelum proses penyimpanan dijalankan.

    Validasi input tanggal
    Validasi input tanggal
    9. Setelah seluruh input - Tombol Simpan

    Setelah seluruh input tersedia, tambahkan tombol Simpan untuk menjalankan proses validasi form. Tombol menggunakan ElevatedButton dengan warna merah dan padding vertikal agar tampil sesuai dengan tema aplikasi. Ketika tombol ditekan, _formKey.currentState!.validate() memeriksa seluruh validator pada form.

    Tombol Simpan dengan validasi lengkap
    Tombol Simpan dengan validasi lengkap
    10. Selanjutnya - SnackBar keberhasilan

    Selanjutnya, apabila seluruh validasi berhasil, tampilkan pesan keberhasilan menggunakan SnackBar. Program menampilkan pesan "Transaksi Berhasil Disimpan!" sebagai pemberitahuan bahwa data telah melewati proses validasi. Setelah itu, Navigator.pop(context) dijalankan untuk menutup halaman form dan kembali ke halaman sebelumnya, yaitu dashboard.

    SnackBar dan Navigator.pop setelah validasi
    SnackBar dan Navigator.pop setelah validasi
    11. Terakhir - dispose() controller

    Terakhir, tambahkan method dispose() untuk memanggil dispose() pada seluruh TextEditingController yang digunakan. Ketiga controller, yaitu _titleController, _amountController, dan _dateController, dilepaskan sebelum super.dispose() dipanggil sehingga pengelolaan controller pada halaman form tetap ditangani secara lengkap.

    Method dispose() untuk cleanup controller
    Method dispose() untuk cleanup controller
    12. Dengan demikian - Kesimpulan implementasi

    Dengan demikian, add_transaction_screen.dart telah menerapkan form transaksi yang terdiri dari input judul, nominal, dan tanggal. Input tanggal menggunakan showDatePicker, hasil pilihan diformat menjadi DD/MM/YYYY, seluruh field memiliki validasi wajib diisi, dan setelah validasi berhasil halaman kembali ke dashboard menggunakan Navigator.pop. Implementasi ini sesuai dengan latihan pada modul yang meminta penambahan input tanggal transaksi dan validasi wajib diisi.

    Form transaksi lengkap dengan semua fitur - Screenshot 1
    Form transaksi lengkap dengan semua fitur - Screenshot 1
    Form transaksi lengkap dengan semua fitur - Screenshot 2
    Form transaksi lengkap dengan semua fitur - Screenshot 2
  6. Kesimpulan

    Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa konsep navigasi dan passing data pada Flutter berhasil diterapkan melalui beberapa halaman yang saling terhubung. Navigator.push digunakan untuk berpindah dari dashboard ke halaman pencatatan transaksi maupun halaman detail, sedangkan Navigator.pop digunakan untuk kembali ke halaman sebelumnya setelah proses selesai.

    Selain itu, praktikum berhasil menerapkan passing data melalui constructor dengan parameter required pada TransactionDetailScreen, sehingga data seperti judul, nominal, kategori, dan tanggal dapat dikirim dari dashboard dan ditampilkan pada halaman detail. Penerapan form transaksi juga telah dilengkapi validasi input judul, nominal, dan tanggal, serta pemilihan tanggal menggunakan showDatePicker dengan format DD/MM/YYYY.

    Dengan demikian, praktikum ini memberikan pemahaman mengenai penggunaan Navigator, konsep stack, passing data antarhalaman, form validation, dan pengelolaan input pada aplikasi mobile Flutter sesuai dengan implementasi program yang dibuat.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub
Aplikasi Mobile

Flutter Form Validation: TextField & TextFormField

Ringkasan laporan praktikum tentang implementasi widget input TextField dan TextFormField di Flutter dengan fokus pada validasi form, pengelolaan state, dan lifecycle management.

  1. Pendahuluan

    Flutter sebagai framework pengembangan aplikasi mobile modern menyediakan berbagai widget yang memungkinkan developer untuk membangun antarmuka pengguna yang interaktif dan responsif. Salah satu aspek fundamental dalam pengembangan aplikasi adalah kemampuan untuk menerima, mengelola, dan memvalidasi input dari pengguna. Flutter menyediakan dua widget utama untuk menangani input teks, yaitu TextField dan TextFormField.

    TextField adalah widget dasar untuk menerima input teks yang memberikan fleksibilitas tinggi dalam styling dan behavior, cocok untuk kasus sederhana seperti search bar atau input tunggal. Sementara itu, TextFormField merupakan versi yang lebih advance yang terintegrasi dengan widget Form dan menyediakan fitur validasi yang lebih robust melalui properti validator, memungkinkan developer untuk mendefinisikan aturan validasi secara deklaratif dan menampilkan pesan error secara otomatis.

    Dalam praktikum ini, dilakukan implementasi kedua jenis input widget tersebut untuk memahami perbedaan karakteristik dan use case dalam penggunaannya. Implementasi meliputi pembuatan basic form menggunakan TextField dengan TextEditingController untuk menangkap input pengguna dan menampilkan feedback melalui SnackBar, serta implementasi form dengan TextFormField yang dilengkapi dengan mekanisme validasi menggunakan GlobalKey untuk memastikan data input sesuai aturan yang ditetapkan.

    Praktikum ini juga mencakup pemahaman konsep-konsep penting seperti StatefulWidget untuk mengelola state, lifecycle method dispose() untuk pembersihan resource dan mencegah memory leak, serta penggunaan kata kunci const untuk optimasi performa. Melalui praktikum ini, diharapkan dapat dipahami secara komprehensif cara kerja input widgets di Flutter, mengelola state dan controller, melakukan validasi input, dan menerapkan best practice dalam pengembangan form yang user-friendly dan performant.

  2. Tujuan

    • Memahami konsep, perbedaan, dan mampu mengimplementasikan basic form menggunakan widget TextField dan TextFormField dalam Flutter untuk menerima dan mengelola input dari pengguna.
    • Mampu menggunakan TextEditingController untuk mengelola nilai input, GlobalKey untuk manajemen state form secara kolektif, serta menerapkan method validator untuk melakukan validasi input sesuai aturan yang ditentukan (required field dan format email).
    • Memahami dan menerapkan lifecycle method dispose() untuk pembersihan resource dan mencegah memory leak, serta penggunaan setState() untuk memicu rebuild widget ketika terjadi perubahan state.
    • Mampu memberikan feedback kepada pengguna menggunakan SnackBar dan menerapkan best practice dalam pengembangan form yang user-friendly, performant, dan mengikuti prinsip clean code.
  3. Alat atau Tools yang Dipakai

    • Flutter SDK
    • Dart Programming Language
    • Android Studio / Visual Studio Code
    • Android Emulator / iOS Simulator
    • Git & GitHub
  4. Langkah Pengerjaan

    Pada bagian ini dilakukan proses implementasi basic form menggunakan TextField dan form validation menggunakan TextFormField. Tahapan pengerjaan dimulai dari pembuatan file baru, konfigurasi widget, implementasi controller, hingga validasi input.

    📱 File Pertama: Implementasi Basic Form dengan TextField

    form-textfield.dart

    a. Import Package dan Main Function

    Langkah pertama adalah membuat file baru form-textfield.dart di dalam folder lib dan mengimport package Flutter Material Design yang menyediakan widget-widget dasar untuk membangun UI.

    Screenshot import package
    Import package Material Design
    b. Class MyApp

    Selanjutnya, dibuat class MyApp sebagai root widget yang menggunakan StatelessWidget karena tidak memerlukan perubahan state. Widget ini mengembalikan MaterialApp dengan Scaffold yang berisi AppBar dan body.

    Screenshot Class MyApp
    Class MyApp sebagai root widget
    c. Class MyForm StatefulWidget

    Kemudian dibuat class MyForm yang extends StatefulWidget karena form ini akan mengelola state berupa input text dari pengguna. StatefulWidget memerlukan class State yang terpisah untuk mengelola logika dan state-nya.

    Screenshot Class MyForm
    Class MyForm extends StatefulWidget
    d. Deklarasi TextEditingController

    Di dalam class _MyFormState, dideklarasikan variabel _textEditingController yang berfungsi sebagai controller untuk mengambil dan mengelola nilai input dari TextField. Controller ini sangat penting untuk mendapatkan nilai yang diinputkan pengguna.

    Screenshot TextEditingController
    Deklarasi TextEditingController
    e. Method dispose()

    Method dispose() dioverride untuk membersihkan TextEditingController ketika widget dihapus dari widget tree. Ini penting untuk mencegah memory leak karena controller perlu di-dispose secara manual.

    Screenshot dispose method
    Method dispose() untuk membersihkan controller
    f. Method build() dengan Padding dan Column

    Pada method build(), dibuat layout menggunakan Padding untuk memberikan jarak dari tepi layar, dan Column untuk menyusun widget secara vertikal dengan crossAxisAlignment.start agar konten rata kiri.

    Screenshot build method
    Method build() dengan Padding dan Column
    g. Widget Text dan SizedBox

    Ditambahkan widget Text sebagai label instruksi untuk pengguna, diikuti dengan SizedBox untuk memberikan jarak vertikal sebesar 10 pixel sebelum TextField.

    Screenshot Text label
    Widget Text dan SizedBox
    h. TextField dengan InputDecoration

    Dibuat widget TextField dengan berbagai properti decoration untuk tampilan visual yang menarik. InputDecoration berisi labelText sebagai label, hintText sebagai placeholder, border: OutlineInputBorder() untuk border kotak, dan prefixIcon untuk icon di sebelah kiri.

    Screenshot TextField decoration
    TextField dengan InputDecoration
    i. Properti controller, keyboardType, dan onChanged

    Pada TextField yang sama, ditambahkan properti controller yang menghubungkan dengan _textEditingController, keyboardType untuk menentukan jenis keyboard yang muncul (text), dan onChanged sebagai event listener yang akan dijalankan setiap kali ada perubahan input.

    Screenshot TextField properties
    Properti controller, keyboardType, dan onChanged
    j. SizedBox untuk Jarak

    Ditambahkan SizedBox dengan height 20 untuk memberikan jarak antara TextField dan button.

    Screenshot SizedBox
    SizedBox untuk jarak
    k. ElevatedButton dengan SnackBar

    Dibuat ElevatedButton dengan method onPressed yang akan mengambil nilai dari controller, kemudian menampilkan nilai tersebut menggunakan SnackBar. Button ini juga diberi styling menggunakan styleFrom dengan background amber dan foreground hitam.

    Screenshot ElevatedButton
    ElevatedButton dengan SnackBar
    l. Hasil Running Aplikasi TextField

    Jalankan programnya dan akan terlihat seperti pada gambar di bawah ini.

    Screenshot Hasil running TextField
    Tampilan hasil running aplikasi TextField

    📱 File Kedua: Implementasi Form Validation dengan TextFormField

    form-textformfield.dart

    a. Import Package dan Main Function

    Sama seperti file sebelumnya, langkah pertama adalah mengimport package Material dan membuat main function yang menjalankan aplikasi.

    Screenshot Import TextFormField
    Import package dan main function
    b. Class MyApp

    Dibuat class MyApp sebagai root widget dengan judul AppBar "Basic Form TextFormField" untuk membedakan dengan implementasi TextField sebelumnya.

    Screenshot MyApp TextFormField
    Class MyApp untuk TextFormField
    c. Class MyFormText StatefulWidget

    Dibuat class MyFormText yang extends StatefulWidget karena form ini akan mengelola state yang lebih kompleks dengan mekanisme validasi.

    Screenshot MyFormText class
    Class MyFormText extends StatefulWidget
    d. Deklarasi GlobalKey dan Controllers

    Di dalam class _MyFormTextState, dideklarasikan _formKey bertipe GlobalKey<FormState> yang berfungsi untuk mengakses state dari Form dan memanggil method validasi. Kemudian dideklarasikan dua controller untuk field nama dan email.

    Screenshot GlobalKey declaration
    Deklarasi GlobalKey dan controllers
    e. Method dispose()

    Method dispose() dioverride untuk membersihkan kedua controller (name dan email) ketika widget dihapus dari widget tree.

    Screenshot dispose() method
    Method dispose() untuk kedua controller
    f. Method _submitForm() dengan Validasi

    Dibuat method _submitForm() yang akan dipanggil ketika button submit ditekan. Method ini menggunakan _formKey.currentState!.validate() untuk menjalankan validasi pada semua TextFormField. Jika validasi berhasil (return true), maka nilai dari kedua controller diambil dan ditampilkan menggunakan SnackBar.

    Screenshot _submitForm() method
    Method _submitForm() dengan validasi
    g. Widget Form dengan Key

    Pada method build(), layout dibungkus dengan widget Form dan diberi key _formKey untuk menghubungkan dengan GlobalKey yang telah dideklarasikan. Form ini kemudian berisi Padding dan Column untuk layout.

    Screenshot Widget Form
    Widget Form dengan key
    h. SizedBox untuk Jarak dari Atas

    Ditambahkan SizedBox dengan height 10 untuk memberikan jarak dari atas.

    Screenshot SizedBox
    SizedBox untuk jarak dari atas
    i. TextFormField untuk Input Nama

    Dibuat TextFormField pertama untuk input nama dengan controller _nameController dan decoration yang sesuai. Yang membedakan dengan TextField adalah adanya properti validator yang berisi logika validasi. Validator ini menerima parameter value dan mengembalikan String jika ada error, atau null jika valid.

    Screenshot TextFormField nama
    TextFormField untuk input nama
    j. SizedBox untuk Jarak Antar Field

    Ditambahkan SizedBox untuk jarak antar TextFormField.

    Screenshot SizedBox jarak
    SizedBox untuk jarak antar field
    k. TextFormField untuk Input Email

    Dibuat TextFormField kedua untuk input email dengan controller _emailController. Validator pada field ini lebih kompleks karena memeriksa dua kondisi: apakah field kosong dan apakah format email valid (mengandung '@').

    Screenshot TextFormField email
    TextFormField untuk input email
    l. SizedBox untuk Jarak Sebelum Button

    Ditambahkan SizedBox untuk jarak sebelum button submit.

    Screenshot SizedBox button
    SizedBox sebelum button
    m. ElevatedButton Submit dengan Full Width

    Dibuat SizedBox dengan width double.infinity agar button memenuhi lebar layar, kemudian di dalamnya terdapat ElevatedButton yang onPressed-nya memanggil method _submitForm yang telah dibuat sebelumnya.

    Screenshot Button submit
    Button submit dengan full width
    n. Hasil Running Aplikasi TextFormField

    Jalankan programnya dan akan terlihat seperti pada gambar di bawah ini.

    Screenshot Hasil running TextFormField
    Tampilan hasil running aplikasi TextFormField

    🧮 TUGAS PRAKTIKUM

    Aplikasi Kalkulator Sederhana

    📱 File Ketiga: Main Application

    main.dart

    a. Import Package dan Calculator Page

    Import material.dart dan calculator_page.dart

    Screenshot Import package
    Import material dan calculator_page
    b. Fungsi main() dengan runApp(MyApp())

    Fungsi main sebagai entry point aplikasi

    Screenshot main() function
    Fungsi main dengan runApp
    c. Class MyApp

    Class MyApp sebagai root widget aplikasi dengan MaterialApp, theme, dan home

    Screenshot MyApp class
    Class MyApp dengan MaterialApp

    📱 File Keempat: Calculator Page Implementation

    calculator_page.dart

    a. Import Material Package dan CalculatorPage Class

    Import material package dan class CalculatorPage

    Screenshot CalculatorPage class
    Class CalculatorPage extends StatefulWidget
    b. Deklarasi Variabel-Variabel yang Diperlukan

    Deklarasi variabel untuk mengelola state kalkulator

    Screenshot Variable declarations
    Deklarasi variabel state kalkulator
    c. Method dispose() untuk Membersihkan Memory

    Method dispose untuk cleanup resource

    Screenshot dispose() method
    Method dispose untuk cleanup
    d. Fungsi Utama untuk Melakukan Perhitungan

    Fungsi ini pertama-tama mengambil text dari kedua controller, lalu melakukan validasi untuk memastikan kedua field tidak kosong. Jika ada yang kosong, akan muncul SnackBar peringatan berwarna merah.

    Screenshot Calculation methods part 1
    Fungsi perhitungan - validasi input

    Selanjutnya, kita mengubah text menjadi angka menggunakan double.tryParse(). Jika parsing gagal (input bukan angka), akan muncul peringatan.

    Screenshot Calculation methods part 2
    Parsing input menjadi angka

    Pada bagian ini, kita menggunakan switch-case untuk menentukan operasi yang akan dilakukan.

    Screenshot Calculation methods part 3
    Switch-case untuk operasi matematika

    Setelah perhitungan selesai, kita gunakan setState() untuk mengupdate tampilan hasil, dan menampilkan SnackBar hijau sebagai konfirmasi perhitungan berhasil.

    Screenshot Calculation methods part 4
    Update state dan tampilkan hasil
    e. Kemudian, kita membuat tampilan UI aplikasi kalkulator
    Screenshot UI part 1
    Scaffold dengan AppBar

    Scaffold menyediakan struktur dasar halaman dengan AppBar berwarna deep purple dan judul "Kalkulator Kalkulator".

    Screenshot UI part 2
    Body dengan SingleChildScrollView

    Bagian header menampilkan icon kalkulator berbukuran besar, judul aplikasi, dan instruksi singkat untuk pengguna. Kita menggunakan SingleChildScrollView agar konten bisa di-scroll jika layar kecil.

    Screenshot UI part 3
    TextField dengan controller

    TextField pertama menggunakan _firstNumberController sebagai controller, dengan keyboard tipe numeric. Decoration meliputi label, hint text, icon angka 1, dan border dengan rounded corners. Saat di-focus, border akan berubah menjadi deep purple dengan ketebalan 2 pixel.

    Screenshot UI part 4
    TextField kedua dengan struktur sama

    TextField kedua memiliki struktur yang sama dengan TextField pertama, namun menggunakan _secondNumberController dan icon angka 2.

    Screenshot UI part 5
    Button operasi matematika

    Pada bagian ini, kita membuat 4 tombol operasi matematika yang disusun dalam Row dengan spacing merata (spaceEvenly).

    Screenshot UI part 6
    Tampilan hasil perhitungan

    Bagian terakhir menampilkan hasil perhitungan. Pertama ada Divider sebagai pemisah visual, kemudian label "Hasil Perhitungan", dan terakhir Container yang menampilkan nilai _result.

    f. Jalankan Program dan Coba

    Hasil running aplikasi kalkulator

    Screenshot Hasil running Calculator
    Tampilan hasil running aplikasi Kalkulator
  5. Kesimpulan

    Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa Flutter menyediakan dua widget utama untuk menangani input teks dari pengguna yaitu TextField dan TextFormField, dimana keduanya memiliki karakteristik dan use case yang berbeda. TextField merupakan widget yang lebih sederhana dan fleksibel, cocok digunakan untuk input tunggal atau form sederhana yang tidak memerlukan validasi kompleks, dengan mengandalkan TextEditingController untuk mengelola nilai input dan event listener onChanged untuk menangkap perubahan secara real-time.

    Sementara TextFormField merupakan widget yang lebih advance dengan fitur validasi bawaan melalui properti validator, yang terintegrasi dengan widget Form dan GlobalKey untuk melakukan validasi kolektif terhadap multiple input fields, menampilkan pesan error secara otomatis, dan mengelola state form secara terpusat dengan method validate().

    Praktikum ini juga memberikan pemahaman mendalam tentang konsep-konsep penting dalam Flutter seperti penggunaan StatefulWidget untuk mengelola state yang dapat berubah, TextEditingController untuk mengontrol dan mengambil nilai input, lifecycle method dispose() yang sangat penting untuk pembersihan resource dan mencegah memory leak, serta penggunaan setState() untuk memicu rebuild widget ketika terjadi perubahan state.

    Implementasi kedua jenis form ini menunjukkan bahwa pemilihan widget yang tepat sangat bergantung pada kompleksitas requirement aplikasi, dimana TextField cocok untuk kasus sederhana dengan kontrol manual, sedangkan TextFormField lebih efisien untuk form yang memerlukan validasi kompleks dengan multiple field. Penerapan best practice seperti penggunaan const keyword untuk optimasi performa, proper resource management dengan dispose(), dan pemberian feedback yang jelas kepada pengguna melalui SnackBar merupakan hal fundamental yang harus diperhatikan dalam pengembangan aplikasi Flutter yang robust, user-friendly, dan performant.

Source Archive

Repository Praktikum

Kode dan arsip project dapat dibuka melalui repository GitHub berikut.

Buka GitHub