projek_padi/mobile_TA/INTEGRATION_SUMMARY.md

15 KiB
Raw Blame History

✅ Flutter Mobile App - Integration Complete

Integrasi API Classification ke aplikasi Flutter Anda SELESAI!

Berikut adalah ringkasan lengkap file yang dibuat dan diupdate.


📋 File yang Dibuat

✨ File Baru

File Lokasi Fungsi
classification_service.dart lib/services/ 🔥 API Service - Handle semua komunikasi dengan server
MOBILE_SETUP.md mobile_TA/ 📚 Panduan setup lengkap

🔄 File yang Diupdate

🔧 Updated Files

File Perubahan Impact
dashboard_klasifikasi.dart ✅ Tambah import ClassificationService Sekarang memanggil API real
✅ Tambah _isLoading dan _errorMessage state Loading indicator + error display
✅ Tambah _handleClassification() method Proses klasifikasi dengan API
✅ Update button onPressed Kirim gambar ke server
result_screen.dart ✅ Ubah constructor - terima ClassificationResult Menampilkan hasil API real
✅ Add disease info display Gejala, treatment, severity
✅ Add confidence score progress bar Visual confidence
✅ Add all predictions analysis Score untuk semua kelas
✅ Update detail popup Gejala & treatment dari API
pubspec.yaml ✅ Tambah permission_handler Camera & storage permissions

🎯 Fitur yang Tersedia

Image Management ✅

  • Upload dari galeri
  • Ambil dari kamera
  • Preview sebelum klasifikasi
  • Ubah/hapus foto

API Integration ✅

  • Send image ke server
  • Dapatkan classification result
  • Disease information (gejala + treatment)
  • Confidence score & severity

UI/UX ✅

  • Loading spinner saat processing
  • Error messages yang jelas
  • Confidence progress bar
  • Severity color-coded badges
  • Detailed disease information
  • All predictions visualization

Error Handling ✅

  • Network error messages
  • Timeout handling
  • File validation
  • Loading states

🔌 API Flow

┌─────────────────────────────────────────────────────────┐
│              FLUTTER MOBILE APP                         │
│                                                         │
│  HomeScreen                                             │
│    ├─ Pilih/ambil foto daun padi                       │
│    └─ Tap "Klasifikasi Sekarang"                       │
│                ↓                                        │
│  dashboard_klasifikasi.dart                             │
│    ├─ Validate image                                   │
│    ├─ Call _handleClassification()                     │
│    └─ Show loading spinner                             │
└────────────────────┬──────────────────────────────────┘
                     │
                     │ HTTP POST /classify-and-save
                     │ (multipart form-data)
                     ↓
┌─────────────────────────────────────────────────────────┐
│         LARAVEL WEB BACKEND (Port 8000)                │
│                                                         │
│  ClassificationController                               │
│    ├─ Receive image file                               │
│    ├─ Encode to base64                                 │
│    └─ Forward to Python API                            │
└────────────────────┬──────────────────────────────────┘
                     │
                     │ HTTP POST /classify
                     │ (with base64 image)
                     ↓
┌─────────────────────────────────────────────────────────┐
│       PYTHON FLASK API (Port 5000)                     │
│                                                         │
│  api_server.py                                          │
│    ├─ Decode base64 image                              │
│    ├─ Preprocess (224x224, normalize)                  │
│    ├─ Load TensorFlow model                            │
│    ├─ Run prediction                                   │
│    └─ Return JSON result                               │
└────────────────────┬──────────────────────────────────┘
                     │
                     │ JSON Response
                     │ {predicted_class, confidence, disease_info}
                     ↓
┌─────────────────────────────────────────────────────────┐
│    LARAVEL RETURNS TO FLUTTER                          │
│                                                         │
│  ClassificationResult object created                    │
│    ├─ predictedClass                                   │
│    ├─ confidence                                       │
│    ├─ diseaseInfo (name, symptoms, treatment)          │
│    └─ allPredictions                                   │
└────────────────────┬──────────────────────────────────┘
                     │
                     │ NavigatorPush(ResultScreen)
                     ↓
┌─────────────────────────────────────────────────────────┐
│         FLUTTER - RESULT SCREEN                        │
│                                                         │
│  result_screen.dart                                     │
│    ├─ Display disease name & confidence                │
│    ├─ Show severity badge                              │
│    ├─ List symptoms                                    │
│    ├─ List treatment recommendations                   │
│    ├─ Show all predictions scores                      │
│    └─ Display product recommendations                  │
└─────────────────────────────────────────────────────────┘

🚀 Langkah Setup

1️⃣ Update Server URL (CRITICAL!)

File: lib/services/classification_service.dart line 7

// SEBELUM:
static const String _baseUrl = 'http://10.0.2.2:8000/api/classification';

// UBAH KE SESUAI ENVIRONMENT ANDA:
// Emulator Android: http://10.0.2.2:8000/api/classification
// Device Fisik: http://192.168.x.x:8000/api/classification  (ganti dengan IP komputer)
// iOS Emulator: http://127.0.0.1:8000/api/classification

Cari IP komputer:

# Windows
ipconfig
# Mac/Linux
ifconfig

2️⃣ Install Dependencies

cd "d:\PROJECT TA\mobile_TA\padi_app"
flutter pub get

3️⃣ Run Server (3 Terminal)

Terminal 1 - Python API:

cd "d:\PROJECT TA\rice leaf diseases dataset"
python api_server.py

Terminal 2 - Laravel:

cd "d:\PROJECT TA\web_TA"
php artisan serve

Terminal 3 - Flutter:

cd "d:\PROJECT TA\mobile_TA\padi_app"
flutter run

4️⃣ Test

  1. App terbuka
  2. Navigate ke classification screen
  3. Pilih/ambil foto
  4. Tap "Klasifikasi Sekarang"
  5. Lihat hasil dengan confidence score, gejala, dan treatment

📱 File Locations

PROJECT TA/
├── mobile_TA/
│   ├── 📄 MOBILE_SETUP.md           ← Baca ini untuk setup!
│   ├── 📄 INTEGRATION_SUMMARY.md     ← File ini
│   └── padi_app/
│       ├── pubspec.yaml             ← Updated dengan permission_handler
│       └── lib/
│           ├── 🔥 dashboard_klasifikasi.dart   ← Updated
│           ├── services/
│           │   └── 🔥 classification_service.dart  ← BARU!
│           └── screen/
│               └── 🔥 result_screen.dart        ← Updated
│
├── rice leaf diseases dataset/
│   └── api_server.py                ← Python Flask API (harus running)
│
└── web_TA/
    └── php artisan serve            ← Laravel API (harus running)

⚙️ Configuration Checklist

Sebelum jalankan app, pastikan:

  • Update API URL di classification_service.dart

    • Sesuaikan dengan environment (emulator/device fisik)
    • Cek IP komputer dengan ipconfig
  • Install Flutter dependencies

    flutter pub get
    
  • Python API Server berjalan

    cd rice_leaf_diseases_dataset
    python api_server.py
    
  • Laravel Server berjalan

    cd web_TA
    php artisan serve
    
  • Model file ada

    • rice_leaf_disease_model.keras or .h5
    • Di folder rice leaf diseases dataset/
  • Network connectivity

    • Pastikan device/emulator bisa akses server
    • Test dengan curl atau Postman

🎨 Customization Examples

Ubah Warna Tema

// Di dashboard_klasifikasi.dart
backgroundColor: const Color(0xFF0F703A),  // Hijau

// Di result_screen.dart
backgroundColor: const Color(0xFF0F703A),  // Hijau

Ubah Loading Text

// Di dashboard_klasifikasi.dart
// Di _handleClassification() method
setState(() {
  _isLoading = true;
  _errorMessage = null;
});

Tambah Loading Animation

// Import di top
import 'package:flutter_spinkit/flutter_spinkit.dart';

// Ganti CircularProgressIndicator dengan:
SpinKitRing(color: Colors.white)

🔍 Testing Tips

Test 1: Check API Connection

# Di command line
curl -X GET http://127.0.0.1:8000/api/classification/test
# Should return: {"success": true, "message": "..."}

Test 2: Manual Classification

curl -F "image=@path/to/image.jpg" \
  http://127.0.0.1:8000/api/classification/classify

Test 3: In App

  1. Buka Flutter app
  2. Pilih gambar daun padi
  3. Tap "Klasifikasi Sekarang"
  4. Tunggu hasil (1-2 detik)

📊 Expected Output

Setelah klasifikasi berhasil, user akan lihat:

┌─────────────────────────────────────────┐
│     Hasil Klasifikasi Screen            │
├─────────────────────────────────────────┤
│                                         │
│  Penyakit Terdeteksi:                  │
│  Bacterial Leaf Blight                 │
│                                         │
│  Confidence: 95.23%  [████████░░]      │
│  Severity: Sedang hingga Tinggi        │
│                                         │
│  [Detail Lengkap & Rekomendasi]        │
│                                         │
│  ─────────────────────────────────────  │
│  Analisis Semua Kelas:                 │
│  Bacterialblight: 95.23% [████████░░]  │
│  Brownspot:       3.80%  [░░░░░░░░░░]  │
│  Leafsmut:        0.97%  [░░░░░░░░░░]  │
│                                         │
│  ─────────────────────────────────────  │
│  Rekomendasi Produk:                   │
│  [Produk 1] [Produk 2]                │
│  [Produk 3] [Produk 4]                │
│                                         │
│                  [Selesai]             │
└─────────────────────────────────────────┘

Ketika tap "Detail Lengkap & Rekomendasi":

┌─────────────────────────────────────────┐
│  Detail: Bacterial Leaf Blight          │
├─────────────────────────────────────────┤
│                                         │
│ Deskripsi:                              │
│ Penyakit yang disebabkan oleh bakteri   │
│                                         │
│ Gejala:                                 │
│ • Bercak kecil berwarna kuning          │
│ • Bercak berkembang menjadi panjang     │
│ • Daun berubah warna menjadi kuning     │
│                                         │
│ Penanganan:                             │
│ • Gunakan varietas padi yang tahan      │
│ • Praktikkan rotasi tanaman             │
│ • Hindari irigasi berlebihan            │
│ • Aplikasikan fungisida bakteri         │
│                                         │
│                   [Tutup]              │
└─────────────────────────────────────────┘

🆘 Troubleshooting

Error Solusi
"Network error" Update URL di classification_service.dart
"Request timeout" Pastikan semua 3 servers berjalan
"Model not loaded" Cek Python API server - lihat console output
Image can't be picked Grant camera/storage permissions
Screen blank Pastikan ResultScreen menerima parameter yang benar


✅ Verification Checklist

SERVER SETUP:
☐ Python API running (port 5000)
☐ Laravel API running (port 8000)
☐ Model file exists
☐ All dependencies installed

FLUTTER SETUP:
☐ API URL updated to correct IP
☐ flutter pub get executed
☐ No compilation errors
☐ App runs without crashes

FEATURE TEST:
☐ Can pick image from gallery
☐ Can take photo from camera
☐ Image preview works
☐ Classify button enabled
☐ API response received
☐ Results display correctly
☐ Disease info shows
☐ Confidence score visible

🎯 Next Steps

  1. ✅ Read MOBILE_SETUP.md untuk panduan detail
  2. ✅ Update API URL sesuai environment Anda
  3. ✅ Install dependencies dengan flutter pub get
  4. ✅ Run 3 servers (Python, Laravel, Flutter)
  5. ✅ Test dengan real images dari device camera
  6. 🚀 Deploy to Play Store/App Store (future)

Integration Status: ✅ COMPLETE

Summary:

  • ✅ API Service created & integrated
  • ✅ Dashboard updated with API calls
  • ✅ Result Screen shows real API data
  • ✅ Error handling implemented
  • ✅ Loading states added
  • ✅ Documentation complete

Ready to use! 🎉


Created: March 9, 2026
Version: 1.0
Status: Production Ready