Lewati ke konten utama

BAB 34. FOLDER STRUCTURE FLUTTER

Pendekatan

Menggunakan Clean Architecture + Riverpod + Feature First untuk memastikan kode terorganisir, mudah diuji, dan dapat dikerjakan oleh tim secara paralel.


Struktur Utama

lib/
├── app/ # Konfigurasi aplikasi
├── core/ # Utilitas dan layanan inti
├── features/ # Semua fitur terpisah
├── shared/ # Komponen yang dipakai bersama
└── main.dart # Entry point

Detail Setiap Folder

app/ — Konfigurasi Aplikasi

app/
├── router/ # GoRouter route definitions
│ └── app_router.dart
├── theme/ # Color, typography, spacing tokens
│ └── app_theme.dart
├── config/ # API base URL, environment
│ └── app_config.dart
└── app.dart # Root widget & ProviderScope

core/ — Layanan Inti

core/
├── network/ # HTTP client (Dio + interceptors)
│ ├── api_client.dart
│ └── auth_interceptor.dart
├── storage/ # Flutter Secure Storage wrapper
│ └── secure_storage.dart
├── error/ # Exception & failure classes
│ ├── exceptions.dart
│ └── failures.dart
├── utils/ # Date, format, validation helpers
│ └── helpers.dart
├── constants/ # App-wide constants
│ └── app_constants.dart
├── services/ # GPS, QR, FCM service
│ ├── gps_service.dart
│ ├── qr_service.dart
│ └── fcm_service.dart
└── widgets/ # Shared base widgets
├── app_button.dart
├── app_text_field.dart
└── loading_overlay.dart

features/ — Fitur Aplikasi

features/
├── auth/
├── dashboard/
├── profile/
├── request/
├── matching/
├── booking/
├── chat/
├── meeting/
├── rating/
├── leaderboard/
├── notification/
└── teacher/

Struktur Internal Setiap Feature

Setiap feature mengikuti pola 4 layer yang konsisten:

features/request/
├── data/ # Layer implementasi data
│ ├── datasource/ # Remote & local data sources
│ │ └── request_remote_datasource.dart
│ ├── repository/ # Implementasi repository
│ │ └── request_repository_impl.dart
│ ├── dto/ # Data Transfer Objects (JSON mapping)
│ │ └── request_dto.dart
│ └── models/ # Raw model dari API
│ └── request_model.dart

├── domain/ # Layer bisnis (pure Dart, no Flutter)
│ ├── entities/ # Objek bisnis inti
│ │ └── request_entity.dart
│ ├── repositories/ # Interface/contract repository
│ │ └── request_repository.dart
│ └── usecases/ # Use case per aksi
│ ├── create_request.dart
│ ├── get_requests.dart
│ └── cancel_request.dart

├── presentation/ # Layer UI (Flutter widgets)
│ ├── pages/ # Halaman penuh
│ │ ├── request_list_page.dart
│ │ └── create_request_page.dart
│ ├── widgets/ # Widget khusus feature ini
│ │ └── request_card.dart
│ └── controllers/ # StateNotifier/ViewModel
│ └── request_controller.dart

└── providers/ # Riverpod providers
└── request_providers.dart

shared/ — Komponen Bersama

shared/
├── widgets/ # Widget yang dipakai banyak feature
│ ├── user_avatar.dart
│ ├── badge_chip.dart
│ └── empty_state.dart
├── models/ # Model yang dipakai lintas feature
│ └── pagination_model.dart
└── extensions/ # Dart extensions
├── context_extension.dart
└── string_extension.dart

Keuntungan Arsitektur

KeuntunganPenjelasan
ModularSetiap feature berdiri sendiri
Mudah diujiDomain layer adalah pure Dart
ScalableMudah tambah feature baru
Tim paralelSatu tim per feature
KonsistenPola yang sama di semua feature

Dependency Flow

flowchart TD
P["📱 Presentation\n(Pages, Widgets)"] --> UC["⚙️ Domain\n(Use Cases, Entities)"]
UC --> RI["📋 Repository\nInterface"]
RI --> R["🗄️ Data\n(Repository Impl, Datasource)"]
R --> API["🌐 API / Network"]

style P fill:#4f63d2,color:#fff
style UC fill:#7c3aed,color:#fff
style R fill:#059669,color:#fff
style API fill:#1f2937,color:#fff

:::important Aturan Dependency Layer dalam (Domain) tidak boleh bergantung pada layer luar (Data/Presentation). Ketergantungan hanya boleh dari luar ke dalam. :::