Praktikum 1: Aplikasi Mobile

Setup Environment, Dart Dasar dan OOP Dart

Hanifah Larama Agasi - 2311531002

PRAKTIKUM 1

Setup Environment, Dart Dasar dan OOP Dart

Tujuan

Tujuan praktikum ini yaitu mahasiswa membuat menginstall kebutuhan Praktikum Aplikasi Mobile menggunakan bahasa Dart pada framework Flutter, mahasiswa menguasai dasar-dasar Bahasa pemrograman Dart serta konsep OOP Dart :

  • Install SDK Dart dan Integrated Development Editor (IDE)
  • Membuat program sederhana untuk memahami dasar Bahasa pemrograman dart
  • Membuat program sederhana menggunakan konsep OOP

Alat

  • Computer / laptop yang telah terinstall SDK Dart, SDK Flutter
  • IDE (Visual Studio Code / Android Studio)

Langkah-langkah

Install SDK Dart

Sebelum install SDK Dart pastikan arsitektur hardware telah memenuhi persyaratan minimum, Adapun persyaratan minimum yang dibutuhkan untuk install SDK Dart seperti gambar berikut :

Project 1

Menggunakan Chocolatey

Install Chocolatey → https://chocolatey.org/install

Buka command promt atau powershell kemudian ketikan perintah choco install dart-sdk

Extract SDK Dart ZIP

Download SDK Dart pada halaman Dart SDK archive https://dart.dev/getdart/archive#stable-channel

Project 1

Download versi stabil sesuai dengan system operasi pada computer. Selanjutnya extract SDK Dart yang telah di zip

Mengatur PATH SDK dart

Buka Edit the system Environment variable

Project 1

Klik Environment Variables maka akan muncul tampilan seperti berikut

Project 1

Pilih Path → Edit dan tambahkan Path dari SDK Dart C:\tools\dart sdk\bin atau directory_extract\dart-sdk\bin

Cek apakah dart sudah terinstall atau belum dengan mengetikkan dart pada command prompt

Project 1

Install ekstension Dart di VSCode

Project 1

Projek Pertama Dart

Buka command prompt kemudian pilih directory yang akan digunakan untuk menyimpak proyek dart dan ketikkan dart create halo maka proyek dart pertama dengan nama halo akan terbentuk.

Project 1

Untuk menjalankannya masuk ke directory halo dan ketikkan dart run

Project 1

Dari gambar diatas terlihat secara default proyek halo menampilkan pesan Hello Wordl : 42!

Dart x Visual Studio Code

Setelah berhasil membuat proyek pertama Dart dengan nama halo, agar lebih memudahkan dalam mempelajari Bahasa Dart, maka kita perlu membuat proyek dart pada Visual Studio Code, buka Visual Studio Code kemudian buka proyek halo, berikut ini tampilannya pada Visual Studio Code.

Project 1

Dart Dasar

List

List tipe data yang berisi kumpulan data atau dalam bahasa pemrograman lain disebut array, Untuk membuat list yaitu List variabel=[] atau var variabel = [].

Buat file baru pada folder bin dengan nama dart_dasar.dart kemudian buat function main

Buat List dengan tipe string yang berisi nama-nama buah seperti kode program berikut ini.

List fruits = ['Apel', 'Alpukat', 'Nanas', 'Mangga', 'Pisang'];

Selanjutnya untuk menampilkan list dapat menggunakan perintah print(fruits.toString());

Manipulasi List, silahkan tambahkan kode programnya menjadi seperti berikut ini.

Project 1

Output:

Project 1

Set

Set merupakan sebuah tipe data yang mirip dengan list, akan tetapi set tidak memiliki index sehingga data yang ada pada set tidak berurutan, Set tidak menerima duplikasi data Tidak bisa mengakses menggunakan index, Untuk membuat set yaitu Set namaVariabel={}; atau var namaVariabel={};

Tambahkan kode program berikut pada file dart_dasar.dart

Project 1

Output

Project 1

Map

Map adalah tipe data key-value yang mana key seperti index dan value sebagai datanya. Menggunakan kurung kurawal {} dan menggunakan : untuk memisahkan key-value. Jika ada data key yang sama maka yang akan digunakan data key yang terakhir.

Untuk membuat map yaitu:

Map namaVariabel = {};
var namaVariabel = Map();
var namaVariabel = {};

Berikut ini kode program contoh penggunaan Map pada Dart.

Project 1

Output:

Project 1

Perulangan

Cara Pertama :

Project 1

Cara kedua:

Project 1

Output:

Project 1

OOP

Dart Kode program berikut ini merupakan contoh konsep penerapan OOP pada Bahasa Dart. Buat file baru pada folder bin dengan nama oop.dart dan tambahkan kode program berikut.

Project 1

Output:

Project 1

Tugas

Buatlah aplikasi sederhana mini laundry menggunakan Bahasa pemgrograman Dart dengan ketentuan sebagai berikut :

Paket Cuci dan Setrika 1 kg 6.000

Paket Cuci 1 kg 4.000

Paket Setrika 1 kg 3.000

Jika total laundry >= 50.000 maka mendapatkan potongan harga 5%, dan jika lebih dari 100.000 mendapatkan potongan 10%

Tampilkan output jumlah yang harus dibayar

Ubah program diatas menggunakan konsep OOP.

Perancangan Algoritma

    Input: tiga nilai berat (kg) untuk tiap paket.

    Hitung subtotal per paket: berat × harga_per_kg.

    Hitung subtotal keseluruhan: jumlah semua subtotal paket.

    Terapkan aturan diskon:

jika subtotal > 100.000 ⇒ 10%

else jika subtotal ≥ 50.000 ⇒ 5%

else ⇒ 0%

    Hitung total: total = subtotal − (subtotal × diskon%).

    Tampilkan struk: detail paket, subtotal, rule diskon, diskon (Rp), total bayar (Rp).

Implementasi (Prosedural)

    Seluruh logika berada di fungsi main().

    Fungsi kecil:

readInt(label): membaca input integer dari terminal dengan validasi sederhana.

rupiah(n): memformat angka menjadi string rupiah (mis. 150000 → Rp 150.000).

    Variabel konstan menyimpan harga per kg tiap paket.

    Alur: baca input → hitung subtotal → tentukan diskonPersen → hitung diskon & total → cetak struk.

Kelebihan: sederhana, cepat ditulis.

Keterbatasan: struktur kurang modular; sulit dikembangkan (mis. tambah paket/aturan baru).

/import 'dart:io';

// Format Rupiah sederhana
String rupiah(int n) {
  final s = n.toString();
  final buf = StringBuffer();
  int c = 0;
  for (int i = s.length - 1; i >= 0; i--) {
    buf.write(s[i]);
    c++;
    if (c % 3 == 0 && i != 0) buf.write('.');
  }
  return 'Rp ${buf.toString().split('').reversed.join()}';
}

int readInt(String label) {
  stdout.write('$label: ');
  final raw = stdin.readLineSync() ?? '';
  final v = int.tryParse(raw) ?? 0;
  return v < 0 ? 0 : v;
}

void main() {
  // Harga per kg (Rp)
  const hargaCuciSetrika = 6000;
  const hargaCuci = 4000;
  const hargaSetrika = 3000;

  print('=== MINI LAUNDRY — PROSEDURAL ===');
  print('Harga per kg:');
  print('- Paket Cuci & Setrika : ${rupiah(hargaCuciSetrika)} / kg');
  print('- Paket Cuci            : ${rupiah(hargaCuci)} / kg');
  print('- Paket Setrika         : ${rupiah(hargaSetrika)} / kg');
  print('');

  final kgCS = readInt('Masukkan berat Paket Cuci & Setrika (kg)');
  final kgC = readInt('Masukkan berat Paket Cuci (kg)');
  final kgS = readInt('Masukkan berat Paket Setrika (kg)');
  print('');

  final subCS = kgCS * hargaCuciSetrika;
  final subC = kgC * hargaCuci;
  final subS = kgS * hargaSetrika;
  final subtotal = subCS + subC + subS;

  // Aturan diskon otomatis
  int diskonPersen = 0;
  String rule = 'Subtotal < 50.000 → 0%';
  if (subtotal > 100000) {
    diskonPersen = 10;
    rule = 'Subtotal > 100.000 → 10%';
  } else if (subtotal >= 50000) {
    diskonPersen = 5;
    rule = 'Subtotal ≥ 50.000 → 5%';
  }

  final diskon = subtotal * diskonPersen ~/ 100;
  final total = subtotal - diskon;

  print('=== RINCIAN ===');
  print('Cuci & Setrika : $kgCS kg x ${rupiah(hargaCuciSetrika)} = ${rupiah(subCS)}');
  print('Cuci           : $kgC  kg x ${rupiah(hargaCuci)} = ${rupiah(subC)}');
  print('Setrika        : $kgS  kg x ${rupiah(hargaSetrika)} = ${rupiah(subS)}');
  print('Subtotal       : ${rupiah(subtotal)}');
  print('Rule diskon    : $rule');
  print('Diskon ($diskonPersen%) : -${rupiah(diskon)}');
  print('--------------------------------');
  print('Total Bayar    : ${rupiah(total)}');
}

Implementasi (OOP)

    Class LaundryPackage: nama paket & harga/kg.

    Class OrderLine: 1 baris pesanan (paket + kg) + subtotal turunan.

    Class Order:

subtotal: penjumlahan seluruh OrderLine.

discountPercent: menerapkan aturan diskon otomatis berdasarkan subtotal.

discount, total, dan ruleText: nilai turunan untuk struk.

printReceipt(): mencetak struk dengan format rapi.

Kelebihan: modular, mudah diekstensikan (mis. voucher, paket baru).

Keterbatasan: kode sedikit lebih panjang dibanding prosedural.

import 'dart:io';

// Util format rupiah
String rupiah(int n) {
  final s = n.toString();
  final buf = StringBuffer();
  int c = 0;
  for (int i = s.length - 1; i >= 0; i--) {
    buf.write(s[i]);
    c++;
    if (c % 3 == 0 && i != 0) buf.write('.');
  }
  return 'Rp ${buf.toString().split('').reversed.join()}';
}

class LaundryPackage {
  final String name;
  final int pricePerKg;
  const LaundryPackage(this.name, this.pricePerKg);
}

class OrderLine {
  final LaundryPackage pack;
  final int kg;
  const OrderLine(this.pack, this.kg);
  int get subtotal => kg * pack.pricePerKg;
}

class Order {
  final List lines;
  Order(this.lines);

  int get subtotal => lines.fold(0, (s, l) => s + l.subtotal);

  int get discountPercent {
    final s = subtotal;
    if (s > 100000) return 10;       // > 100.000 → 10%
    if (s >= 50000) return 5;        // ≥ 50.000  → 5%
    return 0;
  }

  String get ruleText {
    final s = subtotal;
    if (s > 100000) return 'Subtotal > 100.000 → 10%';
    if (s >= 50000) return 'Subtotal ≥ 50.000 → 5%';
    return 'Subtotal < 50.000 → 0%';
  }

  int get discount => subtotal * discountPercent ~/ 100;
  int get total => subtotal - discount;

  void printReceipt() {
    print('=== RINCIAN PESANAN ===');
    for (final l in lines) {
      if (l.kg <= 0) continue;
      final nm = l.pack.name.length >= 16 ? l.pack.name : l.pack.name.padRight(16);
      print('$nm : ${l.kg} kg x ${rupiah(l.pack.pricePerKg)} = ${rupiah(l.subtotal)}');
    }
    print('Subtotal       : ${rupiah(subtotal)}');
    print('Rule diskon    : $ruleText');
    print('Diskon (${discountPercent}%) : -${rupiah(discount)}');
    print('--------------------------------');
    print('Total Bayar    : ${rupiah(total)}');
  }
}

int readInt(String label) {
  stdout.write('$label: ');
  final raw = stdin.readLineSync() ?? '';
  final v = int.tryParse(raw) ?? 0;
  return v < 0 ? 0 : v;
}

void main() {
  const pCS = LaundryPackage('Cuci & Setrika', 6000);
  const pC  = LaundryPackage('Cuci',           4000);
  const pS  = LaundryPackage('Setrika',        3000);

  print('=== MINI LAUNDRY — OOP ===');
  print('Harga per kg:');
  print('- ${pCS.name} : ${rupiah(pCS.pricePerKg)} / kg');
  print('- ${pC.name.padRight(15)}: ${rupiah(pC.pricePerKg)} / kg');
  print('- ${pS.name.padRight(15)}: ${rupiah(pS.pricePerKg)} / kg');
  print('');

  final kgCS = readInt('Masukkan berat ${pCS.name} (kg)');
  final kgC  = readInt('Masukkan berat ${pC.name} (kg)');
  final kgS  = readInt('Masukkan berat ${pS.name} (kg)');
  print('');

  final order = Order([
    OrderLine(pCS, kgCS),
    OrderLine(pC,  kgC),
    OrderLine(pS,  kgS),
  ]);

  order.printReceipt();
}

Uji Coba & Perhitungan Contoh

    Tanpa diskon

Input: Cuci Setrika = 0 kg, Cuci = 0 kg, Setrika = 5 kg

Subtotal: 5 × 3.000 = Rp 15.000 → diskon 0%

Total: Rp 15.000

Project 1


OOP:

Project 1


    Diskon 5% (≥ Rp50.000)

Input: Cuci Setrika = 8 kg, Cuci = 0, Setrika = 1

Subtotal: (8 × 6.000) + (1 × 3.000) = Rp 51.000 → diskon 5% = Rp 2.550

Total: Rp 51.000 − Rp 2.550 = Rp 48.450

Project 1


OOP:

Project 1


    Diskon 10% (> Rp100.000)

Input: Cuci Setrika = 8 kg, Cuci = 11, Setrika = 3

Subtotal: (8 × 6.000) + (11 × 4.000) + (4 × 3.000) = Rp 101.000 → diskon 10% = Rp 10.100

Total: Rp 101.000 − Rp 10.100 = Rp 90.900

Project 1


OOP:

Project 1


Kesimpulan

Aplikasi mini-laundry berhasil memenuhi spesifikasi: tiga paket layanan, aturan diskon bertingkat yang otomatis, serta output total bayar yang akurat. Versi prosedural cocok untuk kebutuhan cepat & sederhana, sementara versi OOP lebih siap untuk skala lebih besar dan perubahan aturan di masa depan.

Kembali ke Daftar Laporan