Proyek ini adalah template dasar Flutter untuk project Androzon Mobile Engineer 2026.
Direktori proyek disusun menggunakan pendekatan berbasis fitur (feature-first) agar mudah dikembangkan dan dirapikan seiring bertambahnya modul.
lib/
├── main.dart # Entry point aplikasi
├── app/
│ └── config/
│ └── router.dart # Konfigurasi routing menggunakan GoRouter
├── core/
│ └── theme/
│ ├── app_colors.dart # Token warna global aplikasi
│ ├── app_text_styles.dart # Tipografi global aplikasi
│ └── app_theme.dart # Konfigurasi ThemeData Material 3
├── data/ # Direktori Data Layer (Model, Service, Repository)
└── ui/
└── features/
├── onboarding/
│ └── views/
│ └── onboarding_view.dart
├── home/
│ └── views/
│ └── home_view.dart
├── counter_provider/
│ ├── view_models/
│ │ └── provider_counter_notifier.dart
│ └── views/
│ └── provider_counter_view.dart
├── counter_riverpod/
│ ├── providers/
│ │ └── riverpod_counter_provider.dart
│ └── views/
│ └── riverpod_counter_view.dart
└── counter_bloc/
├── cubit/
│ └── bloc_counter_cubit.dart
└── views/
└── bloc_counter_view.dart
assets/
├── images/ # Gambar dan splash screen
└── icons/ # Ikon launcher aplikasi
lib/main.dart: Entry point aplikasi. MendaftarkanProviderScope(Riverpod),MultiProvider(Provider), danMultiBlocProvider(BLoC) secara bersama-sama di root widget tree.lib/app/config/: Konfigurasi global seperti routing menggunakan GoRouter.lib/core/theme/: Design system aplikasi — warna (AppColors), tipografi (AppTextStyles), dan tema Material 3 (AppTheme). Digunakan secara konsisten di seluruh aplikasi.lib/data/: Direktori Data Layer (mencakup Model, Service, dan Repository) untuk logika data aplikasi (pada branchmainfolder ini sengaja dibiarkan kosong sebagai kerangka struktur).lib/ui/features/: Folder fitur yang dibagi per domain. Setiap fitur memiliki sub-folderviews/untuk UI dan folder terpisah untuk logika state (view_models/,providers/, ataucubit/) sesuai state management yang digunakan.assets/: Penyimpanan berkas statis gambar dan ikon aplikasi.
Untuk mempermudah pembandingan, repositori ini memisahkan fitur autentikasi (auth) ke dalam beberapa branch terpisah sesuai pustaka pengelola status yang digunakan:
main: Berisi demo penghitung (Counter) sederhana yang menggunakan ketiga pengelola status secara bersamaan di satu halaman dashboard utama. Branch ini juga berisi struktur dasar tema, splash screen, dan halaman onboarding.feature/provider: Contoh implementasi fitur login dan pendaftaran pengguna menggunakan Provider.feature/riverpod: Contoh implementasi fitur login dan pendaftaran pengguna menggunakan Riverpod.feature/bloc: Contoh implementasi fitur login dan pendaftaran pengguna menggunakan BLoC (Cubit).
Kredensial percobaan (dummy) untuk halaman login:
- Email:
admin@example.com - Password:
password123
Berikut perbandingan objektif dari ketiga pustaka pengelola status yang diimplementasikan dalam proyek ini:
| Kriteria | Provider | Riverpod | BLoC / Cubit |
|---|---|---|---|
| Tingkat Kesulitan | Mudah dipelajari karena mirip dengan arsitektur bawaan Flutter. | Sedang, memerlukan pemahaman tentang konsep provider global di luar widget. | Tinggi, membutuhkan pemahaman tentang aliran data asinkron (streams) dan event. |
| Kode Boilerplate | Sangat sedikit. | Sedikit hingga sedang. | Cukup banyak karena harus mendefinisikan event, state, dan kelas BLoC. |
| Ketergantungan Context | Ya, membutuhkan BuildContext untuk membaca status. |
Tidak, menggunakan objek WidgetRef untuk membaca status di luar context. |
Ya, membutuhkan BuildContext untuk mencari provider BLoC yang sesuai. |
| Skalabilitas | Cocok untuk proyek kecil hingga menengah. | Sangat baik untuk proyek skala kecil hingga besar. | Sangat baik untuk proyek skala besar dengan tim yang banyak. |
Proyek ini menggunakan pustaka google_fonts untuk mengatur tipografi global secara dinamis.
Font akan diunduh secara otomatis dari server Google saat aplikasi pertama kali dijalankan dan disimpan di dalam penyimpanan lokal perangkat:
import 'package:google_fonts/google_fonts.dart';
final TextStyle gayaTeks = GoogleFonts.inter(
fontSize: 16,
fontWeight: FontWeight.normal,
);Jika Anda ingin menghindari penggunaan paket google_fonts dan menggunakan berkas font lokal secara langsung (cara bawaan Flutter), ikuti langkah-langkah berikut:
- Unduh berkas font pilihan Anda (format
.ttfatau.otf) dari penyedia font (misalnya Google Fonts atau lainnya). - Buat direktori bernama
assets/fonts/di dalam proyek Anda. - Simpan berkas font tersebut di dalam direktori tersebut (misalnya
Inter-Regular.ttfdanInter-Bold.ttf).
Konfigurasikan keluarga font tersebut di bagian flutter: pada berkas pubspec.yaml:
flutter:
fonts:
- family: Inter # Nama keluarga font yang akan dipanggil di kode Dart
fonts:
- asset: assets/fonts/Inter-Regular.ttf
- asset: assets/fonts/Inter-Bold.ttf
weight: 700 # Menentukan ketebalan font untuk versi BoldAnda dapat menerapkan font tersebut langsung menggunakan parameter fontFamily pada TextStyle:
const TextStyle gayaTeks = TextStyle(
fontFamily: 'Inter',
fontSize: 16,
fontWeight: FontWeight.bold, // Ini akan menggunakan berkas Inter-Bold.ttf secara otomatis
);Proyek ini menggunakan paket icons_launcher untuk memperbarui ikon aplikasi secara otomatis.
- Persyaratan Aset: Gunakan gambar persegi berformat PNG dengan resolusi minimal 512x512 piksel. Pastikan tidak ada area transparan pada pinggiran gambar agar ikon tampil maksimal pada perangkat Android.
- Cara Membuat:
- Siapkan ikon Anda dan simpan di
assets/icons/icon_launcher.png. - Jalankan perintah berikut di terminal:
dart run icons_launcher:create
- Siapkan ikon Anda dan simpan di
Proyek ini menggunakan paket flutter_native_splash untuk memodifikasi splash screen bawaan perangkat.
- Persyaratan Aset: Siapkan logo berformat PNG dengan resolusi minimal 1024x1024 piksel untuk diletakkan di bagian tengah layar.
- Cara Membuat:
- Siapkan gambar splash screen Anda dan simpan di
assets/images/splash_screen.png. - Sesuaikan konfigurasi warna latar belakang dan letak gambar pada bagian
flutter_native_splashdi dalam berkaspubspec.yaml. - Jalankan perintah berikut di terminal:
flutter pub run flutter_native_splash:create
- Siapkan gambar splash screen Anda dan simpan di
Gunakan tautan di bawah ini untuk mempelajari dasar teori dari masing-masing pustaka pengelola status secara mendalam: