📢 Tugas Review Aplikasi Flutter

💻 Potongan Kode & Penjelasan To-Do App Flutter

Berikut pembahasan lengkap dari bagian kode utama aplikasi Simple To-Do List yang dibuat menggunakan Flutter + Dart. Di sini dijelaskan bagaimana data tugas disimpan, dikelola, dan ditampilkan ke pengguna.


🧩  Potongan Kode (Dart / Flutter)

Potongan berikut mencakup struktur model data, sistem penyimpanan lokal, serta logika penentuan warna dan teks deadline. Semua kode ini bisa ditempatkan di file main.dart atau dipecah menjadi file terpisah untuk arsitektur yang lebih bersih.


// --- Model Data Tugas (Task) ---
class Task {
  String title;        // Judul tugas
  String description;  // Deskripsi singkat tugas
  bool isDone;         // Status apakah tugas selesai
  DateTime deadline;   // Tenggat waktu tugas
  String? category;    // Kategori opsional (misal: kerja, kuliah, pribadi)

  Task({
    required this.title,
    this.description = '',
    this.isDone = false,
    required this.deadline,
    this.category,
  });

  // Mengubah object Task menjadi JSON agar bisa disimpan ke storage
  Map<String, dynamic> toJson() => {
        'title': title,
        'description': description,
        'isDone': isDone,
        'deadline': deadline.toIso8601String(),
        'category': category,
      };

  // Mengubah kembali JSON menjadi object Task saat aplikasi dibuka ulang
  static Task fromJson(Map<String, dynamic> json) => Task(
        title: json['title'] ?? '',
        description: json['description'] ?? '',
        isDone: json['isDone'] ?? false,
        deadline: DateTime.parse(json['deadline']),
        category: json['category'],
      );
}

// --- Penyimpanan Lokal Menggunakan SharedPreferences ---
class LocalStorage {
  static const String key = 'simpletodo_enhanced_v1';

  // Menyimpan seluruh daftar tugas ke storage
  static Future<void> saveTasks(List<Task> tasks) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(
      key,
      jsonEncode(tasks.map((t) => t.toJson()).toList()),
    );
  }

  // Memuat daftar tugas dari storage ketika aplikasi dijalankan
  static Future<List<Task>> loadTasks() async {
    final prefs = await SharedPreferences.getInstance();
    final jsonString = prefs.getString(key);
    if (jsonString == null) return [];
    final List decoded = jsonDecode(jsonString);
    return decoded.map((e) => Task.fromJson(Map.from(e))).toList();
  }
}

// --- Warna & Teks Deadline (Indikator Prioritas) ---
Color getDeadlineColor(DateTime date) {
  final now = DateTime.now();
  if (date.isBefore(now)) return Color(0xFFE53935); // Merah → lewat deadline
  if (date.difference(now).inHours <= 24) return Color(0xFFFB8C00); // Oranye → mendesak
  return Color(0xFF2DCE89); // Hijau → masih aman
}

String getDeadlineText(DateTime date) {
  final now = DateTime.now();
  final diff = date.difference(now);
  if (date.isBefore(now)) return 'Terlambat';
  if (diff.inDays > 0) return '${diff.inDays} hari';
  if (diff.inHours > 0) return '${diff.inHours} jam';
  return '${diff.inMinutes} menit';
}

  

📘 Penjelasan Lengkap Cara Kerja Kode

  1. 1. Struktur Data (Model Task)
    Kelas Task digunakan untuk mewakili setiap tugas yang dibuat pengguna. Ia menyimpan informasi penting seperti judul, deskripsi, status selesai, tenggat waktu, dan kategori. Dengan model seperti ini, data menjadi terorganisir dan mudah dikelola.
  2. 2. Serialisasi Data (toJson & fromJson)
    Flutter tidak bisa langsung menyimpan object ke memori, maka data harus diubah menjadi format JSON. toJson() mengubah object Task ke map JSON agar bisa disimpan. Saat aplikasi dibuka kembali, fromJson() digunakan untuk mengembalikannya menjadi object Task lagi.
  3. 3. Penyimpanan Permanen (SharedPreferences)
    Agar tugas tetap tersimpan meskipun aplikasi ditutup, data disimpan secara lokal menggunakan SharedPreferences. Fungsi saveTasks() menulis semua data ke penyimpanan, sedangkan loadTasks() membacanya kembali saat startup.
  4. 4. Logika Warna Deadline
    Fungsi getDeadlineColor() memberikan warna visual berdasarkan waktu:
    • Merah → Deadline sudah lewat
    • Oranye → Kurang dari 24 jam lagi
    • Hijau → Masih cukup waktu
    Warna ini membantu pengguna melihat prioritas tugas hanya dengan satu pandangan.
  5. 5. Teks Waktu Tersisa (getDeadlineText)
    Fungsi ini menghitung sisa waktu ke tenggat dan menampilkannya dalam bentuk mudah dibaca: 2 hari, 5 jam, atau 15 menit. Jika waktu sudah lewat, otomatis menampilkan “Terlambat”.
  6. 6. Integrasi dengan UI (Task Card)
    Data dari Task ditampilkan dalam bentuk card dengan warna deadline, tombol centang (✔) untuk menandai selesai, dan menu tiga titik (⋮) untuk Edit atau Hapus. Semua ini membuat tampilan lebih interaktif, ringkas, dan mudah dipahami.

Lihat Disini

Komentar

Postingan populer dari blog ini

Jenis-jenis sistem operasi mobile

flutter todo list app

Aplikasi Manajemen Barang Pinjaman dengan Flutter + Fitur Upload Gambar