📱 Membuat Aplikasi Kantin SMKN 1 Banjar dengan Flutter

Modul Praktikum RPL – Mobile Programming

Di era digital, pemesanan makanan tidak lagi harus datang langsung ke kantin. Dengan aplikasi mobile, siswa bisa memesan makanan dan minuman langsung dari kelas, lalu pesanan dikirim melalui WhatsApp ke kurir/jastip.

Pada praktikum ini, kita akan membuat Aplikasi Kantin SMKN 1 Banjar menggunakan Flutter (Dart) yang dapat:

  • Menampilkan daftar menu

  • Menambahkan item ke keranjang

  • Menghitung total harga otomatis

  • Checkout dan mengirim pesanan ke WhatsApp

  • Menyimpan nomor WhatsApp admin


🎯 Tujuan Pembelajaran

Setelah mengikuti praktikum ini, peserta didik mampu:

  1. Memahami struktur dasar project Flutter.

  2. Membuat tampilan UI menggunakan Widget.

  3. Mengelola state sederhana (keranjang belanja).

  4. Menggunakan package eksternal (url_launcher).

  5. Menghubungkan aplikasi dengan WhatsApp.

  6. Build APK aplikasi Android.


🧠 Konsep yang Dipelajari

KonsepPenjelasan
StatelessWidgetWidget yang tidak berubah
StatefulWidgetWidget yang bisa berubah (dynamic)
List & ObjectMenyimpan data menu
setState()Mengubah tampilan saat data berubah
url_launcherMembuka WhatsApp dari aplikasi
Build APKMengubah project menjadi file install Android

🛠 Persiapan Alat

Pastikan sudah terinstall:

  • Flutter SDK

  • Android Studio (Emulator)

  • VS Code + Extension Flutter

Cek dengan:

flutter doctor

🚀 Langkah Praktikum

1️⃣ Membuat Project Baru

flutter create kantin_smkn1banjar
cd kantin_smkn1banjar
code .

2️⃣ Tambahkan Dependency

Buka pubspec.yaml, tambahkan:

dependencies:
  flutter:
    sdk: flutter
  url_launcher: ^6.2.5

Lalu jalankan:

flutter pub get

📦 Struktur Aplikasi

Aplikasi ini memiliki fitur:

  • Beranda (Daftar Menu)

  • Keranjang

  • Checkout

  • Kirim ke WhatsApp


💻 FULL SOURCE CODE (main.dart)

Salin seluruh kode berikut ke:

lib/main.dart

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() {
  runApp(KantinApp());
}

class KantinApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Kantin SMKN 1 Banjar',
      theme: ThemeData(primarySwatch: Colors.green),
      home: HomeScreen(),
    );
  }
}

class MenuItem {
  final String nama;
  final int harga;
  int qty;

  MenuItem({required this.nama, required this.harga, this.qty = 0});
}

List<MenuItem> daftarMenu = [
  MenuItem(nama: "Nasi Goreng", harga: 12000),
  MenuItem(nama: "Mie Ayam", harga: 10000),
  MenuItem(nama: "Bakso", harga: 13000),
  MenuItem(nama: "Es Teh", harga: 5000),
  MenuItem(nama: "Pop Ice", harga: 5000),
];

List<MenuItem> keranjang = [];
String nomorWA = "6281234567890";
int ongkir = 2000;

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  int get total =>
      keranjang.fold(0, (sum, item) => sum + (item.harga * item.qty));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Kantin SMKN 1 Banjar"),
        actions: [
          IconButton(
            icon: Icon(Icons.shopping_cart),
            onPressed: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => CartScreen()));
            },
          )
        ],
      ),
      body: ListView.builder(
        itemCount: daftarMenu.length,
        itemBuilder: (context, index) {
          final item = daftarMenu[index];
          return Card(
            child: ListTile(
              title: Text(item.nama),
              subtitle: Text("Rp ${item.harga}"),
              trailing: item.qty == 0
                  ? ElevatedButton(
                      onPressed: () {
                        setState(() {
                          item.qty = 1;
                          keranjang.add(item);
                        });
                      },
                      child: Text("Tambah"),
                    )
                  : Row(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        IconButton(
                          icon: Icon(Icons.remove),
                          onPressed: () {
                            setState(() {
                              item.qty--;
                              if (item.qty == 0) {
                                keranjang.remove(item);
                              }
                            });
                          },
                        ),
                        Text(item.qty.toString()),
                        IconButton(
                          icon: Icon(Icons.add),
                          onPressed: () {
                            setState(() {
                              item.qty++;
                            });
                          },
                        ),
                      ],
                    ),
            ),
          );
        },
      ),
      floatingActionButton: keranjang.isEmpty
          ? null
          : FloatingActionButton.extended(
              label: Text("Rp $total"),
              icon: Icon(Icons.payment),
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(builder: (_) => CheckoutScreen()));
              },
            ),
    );
  }
}

class CartScreen extends StatelessWidget {
  int get subtotal =>
      keranjang.fold(0, (sum, item) => sum + (item.harga * item.qty));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Keranjang")),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: keranjang.length,
              itemBuilder: (context, index) {
                final item = keranjang[index];
                return ListTile(
                  title: Text("${item.nama} x${item.qty}"),
                  subtitle: Text("Rp ${item.harga * item.qty}"),
                );
              },
            ),
          ),
          Padding(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text("Subtotal: Rp $subtotal"),
                Text("Ongkir: Rp $ongkir"),
                Text(
                  "Total: Rp ${subtotal + ongkir}",
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

class CheckoutScreen extends StatelessWidget {

  void kirimWA() async {
    String pesan = "Pesanan Kantin SMKN 1 Banjar\n\n";
    for (var item in keranjang) {
      pesan += "- ${item.nama} x${item.qty} = Rp ${item.harga * item.qty}\n";
    }

    int total =
        keranjang.fold(0, (sum, item) => sum + (item.harga * item.qty));

    pesan += "\nOngkir: Rp $ongkir";
    pesan += "\nTotal: Rp ${total + ongkir}";

    final url =
        "https://wa.me/$nomorWA?text=${Uri.encodeComponent(pesan)}";

    await launchUrl(Uri.parse(url),
        mode: LaunchMode.externalApplication);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Checkout")),
      body: Center(
        child: ElevatedButton(
          child: Text("Kirim ke WhatsApp"),
          onPressed: kirimWA,
        ),
      ),
    );
  }
}

📦 Cara Build APK

flutter build apk --release

File APK ada di:

build/app/outputs/flutter-apk/app-release.apk

📝 Tugas Praktikum Siswa

  1. Tambahkan 3 menu baru.

  2. Ubah ongkir menjadi 3000.

  3. Tambahkan input nama dan kelas saat checkout.

  4. Tambahkan halaman pengaturan nomor WA.

  5. Ubah tema warna aplikasi.


📊 Refleksi Pembelajaran

Diskusikan dengan siswa:

  • Apa fungsi setState()?

  • Mengapa kita menggunakan List?

  • Bagaimana cara kerja pengiriman ke WhatsApp?

  • Bagaimana jika ingin menyimpan data ke database?


🚀 Pengembangan Lanjutan

Untuk level lanjut, aplikasi bisa dikembangkan menjadi:

  • Login siswa

  • Firebase database

  • Dashboard admin

  • Export PDF laporan

  • QRIS pembayaran

  • Teaching Factory Kantin Digital


Salam Redaksi.

Share:

32 komentar:

  1. https://zakyblud.blogspot.com/2026/05/jastip-kantinsmk.html
    zaky mubarok

    BalasHapus
  2. https://manukireng777.blogspot.com/2026/05/bikin-aplikasi-jastip-kantin-smkn-1.html
    Wisnu Nugroho

    BalasHapus
  3. https://dhanisantibootloop.blogspot.com/2026/05/jastip-kantin-web-app.html
    Dhanis Fathan Gunawan

    BalasHapus
  4. https://iqbalkeceahayyy.blogspot.com/2026/05/pemesanan-kantin.html

    Muhammad Iqbal Ramadhan

    BalasHapus
  5. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  6. https://reihannovalendra.blogspot.com/2026/05/web-kantin-sakola.html

    Reihan Novalendra H

    BalasHapus
  7. https://vinoandrian5.blogspot.com/2026/05/aplikasi-transaksi-atau-pemesanan-kantin.html

    vino andrian

    BalasHapus
  8. https://iqbalkeceahayyy.blogspot.com/2026/05/pemesanan-kantin-black-and-pink.html

    Qori Dwi Anisa

    BalasHapus
  9. https://dehira.blogspot.com/2026/05/aplikasi-kantin-smkn-1-banjar.html

    dehira zallea Iskandar

    BalasHapus
  10. https://fitzzryalw.blogspot.com/2026/05/aplikasi-jastip-kantin.html

    Fito Rizky Alwandi

    BalasHapus
  11. https://pplgbelajar.blogspot.com/2026/05/kantinku-aplikasi-kantin-sekolah-modern.html

    BalasHapus
    Balasan
    1. https://pplgbelajar.blogspot.com/2026/05/kantinku-aplikasi-kantin-sekolah-modern.html

      Euis Noer Samsiah

      Hapus
  12. https://apkcrudbyraffa.blogspot.com/2026/05/kantin-ku.html

    M Raffa Izzel H

    BalasHapus
  13. https://anaz7751.blogspot.com/2026/05/aplikasi-jastip-kantin-bertema-biru-dan.html

    Rizqi Resdhiana

    BalasHapus
  14. https://sandimb.blogspot.com/2026/05/project-aplikasi-jastip-kantin-sekolah_0514602285.html

    BalasHapus
  15. https://vinzz123.blogspot.com/2026/05/web-pemesanan-kantin.html

    Kevin

    BalasHapus
  16. https://anaz7751.blogspot.com/2026/05/aplikasi-jastip-cahya.html

    Cahya Rizky Maulana

    BalasHapus
  17. https://likadwi43.blogspot.com/2026/05/aplikasi-kantin.html

    alika dwi aryani

    BalasHapus
  18. https://kituwenya.blogspot.com/2026/05/kantin.html

    M. Farid Fayzul H.

    BalasHapus
  19. https://maulidanaila0227.blogspot.com/2026/05/aplikasi-kantin.html

    MAULIDA NAILATURROIF

    BalasHapus
  20. https://kantingoraqi.blogspot.com/2026/05/aplikasi-kantingo-pemesanan-makanan.html

    RAQIQHUL QHALBI HIDAYAH

    BalasHapus
  21. https://div43.blogspot.com/2026/05/kantinexpress-aplikasi-pemesanan.html

    BalasHapus
  22. https://anaz7751.blogspot.com/2026/05/aplikasi-jastip-kantin-abu.html

    Muhammad Hizar Abu Yana

    BalasHapus
  23. https://gacorr011.blogspot.com/2026/05/aplikasi-kantin-online-solusi-modern.html

    Gadiza Nugroho

    BalasHapus
  24. https://kalz123.blogspot.com/2026/05/kantin-express-smkn-1-banjar-margin-0.html

    BalasHapus
  25. https://nasyadwiarini.blogspot.com/2026/05/aplikasi-kantin.html

    BalasHapus
  26. https://piliaaa.blogspot.com/2026/05/kantinku-smkn-1-banjar-solusi-pemesanan.html

    BalasHapus
  27. https://tiaraiay315.blogspot.com/2026/05/aplikasi-canteen-order.html

    BalasHapus
  28. https://ristyfitria.blogspot.com/2026/05/aplikasi-kantin.html

    BalasHapus
  29. https://sakonakokodudukwe.blogspot.com/2026/05/apliaksi-kantin-sederhana.html

    hizkil rayi r

    BalasHapus
  30. https://zyxy31.blogspot.com/2026/05/aplikasi-kantinexpress-solusi-pemesanan.html

    BalasHapus
  31. https://zahrasyifa1.blogspot.com/2026/05/aplikasi-kantin.html

    ZAHRA SYIFAA'UR RAHMAH

    BalasHapus

Chat Admin

Chat via WhatsApp

Blogger Tricks

Blogger Themes