Menguasai State Management & Integrasi API dalam Flutter: Panduan Komprehensif
Pendahuluan Pengembangan aplikasi mobile modern membutuhkan manajemen state yang efisien dan kemampuan untuk berkomunikasi dengan API eksternal. Pada pertemuan ke-4 praktikum Flutter ini, kita akan mendalami: Konsep State Management dengan Provider Integrasi API menggunakan HTTP/Dio Arsitektur Clean untuk skalabilitas Bagian 1: State Management dengan Provider Apa Itu State Management? State adalah data yang dapat berubah selama runtime aplikasi. Tanpa manajemen yang baik, aplikasi menjadi: Sulit di-debug Tidak skalabel Rentan performance issues Provider: Solusi State Management Sederhana Provider adalah wrapper di atas InheritedWidget yang menyediakan: ✔️ Mudah digunakan ✔️ Reaktivitas otomatis (dengan notifyListeners()) ✔️ Dukungan untuk dependency injection Implementasi Dasar class CounterProvider with ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); // Memberi tahu widget untuk rebuild } } Cara Menggunakan di UI Consumer( builder: (context, provider, child) { return Text('${provider.count}'); }, ) Best Practice: Gunakan MultiProvider untuk banyak state Pisahkan logika bisnis dari UI Bagian 2: Integrasi API dengan HTTP/Dio HTTP vs Dio: Mana yang Lebih Baik? Fitur http Package dio Package GET/POST ✔️ ✔️ Error Handling Dasar Lengkap Interceptors ❌ ✔️ File Upload Manual Mudah Cancel Request ❌ ✔️ Contoh GET Request dengan Dio final dio = Dio(); final response = await dio.get('https://api.example.com/users'); if (response.statusCode == 200) { return User.fromJson(response.data); } else { throw Exception('Failed to load data'); } Error Handling yang Robust try { final response = await dio.get('/users'); } on DioException catch (e) { if (e.response?.statusCode == 404) { print('Data tidak ditemukan!'); } else { print('Error: ${e.message}'); } } Bagian 3: Arsitektur Clean untuk Aplikasi Flutter Struktur Folder yang Direkomendasikan lib/ ├── core/ │ ├── constants/ # Konstanta global │ └── utils/ # Helper functions ├── data/ │ ├── models/ # Data classes │ └── repositories # API calls ├── presentation/ │ ├── providers/ # State management │ └── screens/ # UI └── main.dart Keuntungan Arsitektur Ini ✅ Separation of Concerns (UI terpisah dari logika) ✅ Mudah di-test ✅ Skalabel untuk proyek besar Studi Kasus: Aplikasi Todo dengan API Langkah Implementasi Buat TodoProvider untuk mengelola state Gunakan Dio untuk fetch data dari jsonplaceholder.typicode.com/todos Tampilkan dalam ListView.builder Contoh Code // 1. Model class Todo { final int id; final String title; bool completed; Todo({required this.id, required this.title, this.completed = false}); } // 2. Provider class TodoProvider with ChangeNotifier { List _todos = []; List get todos => _todos; Future fetchTodos() async { final response = await dio.get('/todos'); _todos = response.data.map((json) => Todo.fromJson(json)).toList(); notifyListeners(); } } Kesimpulan & Rekomendasi Gunakan Provider untuk state management sederhana Pilih Dio jika butuh fitur advanced (interceptors, cancel request) Terapkan clean architecture sejak dini "Menguasai state management dan API adalah kunci membangun aplikasi Flutter yang powerful!"

Pendahuluan
Pengembangan aplikasi mobile modern membutuhkan manajemen state yang efisien dan kemampuan untuk berkomunikasi dengan API eksternal. Pada pertemuan ke-4 praktikum Flutter ini, kita akan mendalami:
- Konsep State Management dengan Provider
- Integrasi API menggunakan HTTP/Dio
- Arsitektur Clean untuk skalabilitas
Bagian 1: State Management dengan Provider
Apa Itu State Management?
State adalah data yang dapat berubah selama runtime aplikasi. Tanpa manajemen yang baik, aplikasi menjadi:
- Sulit di-debug
- Tidak skalabel
- Rentan performance issues
Provider: Solusi State Management Sederhana
Provider adalah wrapper di atas InheritedWidget yang menyediakan:
✔️ Mudah digunakan
✔️ Reaktivitas otomatis (dengan notifyListeners()
)
✔️ Dukungan untuk dependency injection
Implementasi Dasar
class CounterProvider with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // Memberi tahu widget untuk rebuild
}
}
Cara Menggunakan di UI
Consumer<CounterProvider>(
builder: (context, provider, child) {
return Text('${provider.count}');
},
)
Best Practice:
- Gunakan
MultiProvider
untuk banyak state - Pisahkan logika bisnis dari UI
Bagian 2: Integrasi API dengan HTTP/Dio
HTTP vs Dio: Mana yang Lebih Baik?
Fitur |
http Package |
dio Package |
---|---|---|
GET/POST | ✔️ | ✔️ |
Error Handling | Dasar | Lengkap |
Interceptors | ❌ | ✔️ |
File Upload | Manual | Mudah |
Cancel Request | ❌ | ✔️ |
Contoh GET Request dengan Dio
final dio = Dio();
final response = await dio.get('https://api.example.com/users');
if (response.statusCode == 200) {
return User.fromJson(response.data);
} else {
throw Exception('Failed to load data');
}
Error Handling yang Robust
try {
final response = await dio.get('/users');
} on DioException catch (e) {
if (e.response?.statusCode == 404) {
print('Data tidak ditemukan!');
} else {
print('Error: ${e.message}');
}
}
Bagian 3: Arsitektur Clean untuk Aplikasi Flutter
Struktur Folder yang Direkomendasikan
lib/
├── core/
│ ├── constants/ # Konstanta global
│ └── utils/ # Helper functions
├── data/
│ ├── models/ # Data classes
│ └── repositories # API calls
├── presentation/
│ ├── providers/ # State management
│ └── screens/ # UI
└── main.dart
Keuntungan Arsitektur Ini
✅ Separation of Concerns (UI terpisah dari logika)
✅ Mudah di-test
✅ Skalabel untuk proyek besar
Studi Kasus: Aplikasi Todo dengan API
Langkah Implementasi
- Buat
TodoProvider
untuk mengelola state - Gunakan Dio untuk fetch data dari
jsonplaceholder.typicode.com/todos
- Tampilkan dalam
ListView.builder
Contoh Code
// 1. Model
class Todo {
final int id;
final String title;
bool completed;
Todo({required this.id, required this.title, this.completed = false});
}
// 2. Provider
class TodoProvider with ChangeNotifier {
List<Todo> _todos = [];
List<Todo> get todos => _todos;
Future<void> fetchTodos() async {
final response = await dio.get('/todos');
_todos = response.data.map((json) => Todo.fromJson(json)).toList();
notifyListeners();
}
}
Kesimpulan & Rekomendasi
- Gunakan Provider untuk state management sederhana
- Pilih Dio jika butuh fitur advanced (interceptors, cancel request)
- Terapkan clean architecture sejak dini
"Menguasai state management dan API adalah kunci membangun aplikasi Flutter yang powerful!"