Flutter'da ağ isteklerini yönetmek için en popüler kütüphanelerden biri olan Dio, güçlü interceptor yapısı, yeniden deneme mekanizması ve esnek konfigürasyon seçenekleriyle öne çıkar. Bu yazıda Dio'yu kullanarak nasıl sağlam bir HTTP katmanı oluşturabileceğinizi pratik ipuçları ve kontrol listesiyle adım adım ele alıyoruz.
Dio Nedir ve Neden Kullanmalısınız?
Dio, Dart tabanlı, güçlü bir HTTP istemci kütüphanesidir. Varsayılan http paketine kıyasla çok daha fazla özellik sunar: interceptor desteği, global hata yönetimi, istek/yanıt dönüştürme, zaman aşımı ayarları, dosya yükleme/indirme ve daha fazlası. Özellikle birden fazla API ile çalışan, kimlik doğrulama, hata günlüğü veya önbellekleme gibi ortak işlemleri merkezi olarak yönetmek isteyen projeler için idealdir.
Kurulum ve Temel Kullanım
Dio'yu projenize eklemek için pubspec.yaml dosyasına dio: ^5.0.0 satırını ekleyip pub get çalıştırmanız yeterlidir. Ardından basit bir GET isteği şu şekilde yapılır:
import 'package:dio/dio.dart';
final dio = Dio();
void fetchData() async {
try {
Response response = await dio.get('https://api.example.com/data');
print(response.data);
} catch (e) {
print('Hata: $e');
}
}
Ancak gerçek bir uygulamada sadece bu kadarı yeterli değildir. Aşağıdaki pratik ipuçlarıyla daha sağlam bir yapı kurabilirsiniz.
Interceptor ile Merkezi Hata Yönetimi
Interceptor'lar sayesinde tüm istek ve yanıtları merkezi olarak yakalayabilir, loglama, kimlik doğrulama token ekleme, hata dönüştürme gibi işlemleri yapabilirsiniz. Örneğin, 401 durumunda token yenileme mekanizması kurmak oldukça kolaydır. Hata yönetimini REST API hata yönetimi ilkeleriyle uyumlu hale getirmek, kullanıcı deneyimini artırır.
dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
// Token ekleme
options.headers['Authorization'] = 'Bearer $token';
return handler.next(options);
},
onError: (error, handler) {
if (error.response?.statusCode == 401) {
// Token yenileme işlemi
}
return handler.next(error);
},
));
Zaman Aşımı ve Yeniden Deneme Stratejisi
Mobil uygulamalarda ağ bağlantısı her zaman stabil olmayabilir. Dio ile zaman aşımı sürelerini ayarlamak ve belirli hatalarda istekleri tekrarlamak mümkündür. Aşağıdaki örnek, 3 saniye içinde cevap gelmezse isteği iptal eder ve 5xx hatalarında 2 kez yeniden dener:
final dio = Dio(BaseOptions(
connectTimeout: const Duration(seconds: 3),
receiveTimeout: const Duration(seconds: 3),
));
dio.interceptors.add(RetryInterceptor(
dio: dio,
retries: 2,
retryDelays: const [Duration(seconds: 1), Duration(seconds: 2)],
));
Kimlik Doğrulama ve Token Yönetimi
Güvenli API'ler genellikle JWT token kullanır. Dio interceptor'ları ile token'ı her isteğe otomatik ekleyebilir, süresi dolduğunda yenileme işlemini yapabilirsiniz. Detaylı bilgi için JWT token yönetimi yazımıza göz atın.
İstek/ Yanıt Dönüştürme
Dio, gelen veriyi otomatik olarak JSON'dan modele çevirmek için Transformer kullanmanıza olanak tanır. Özel bir dönüştürücü yazarak tüm yanıtları tek bir yerde işleyebilirsiniz.
dio.transformer.setResponseDataCallback((response) {
if (response.data is Map) {
return User.fromJson(response.data);
}
return response.data;
});
Paralel İstekler ve İptal
Birden fazla isteği aynı anda göndermek için Future.wait veya Dio'nun kendi request metodlarını kullanabilirsiniz. İstekleri iptal etmek için CancelToken kullanılır. Bu, özellikle kullanıcı bir ekranı terk ettiğinde gereksiz ağ trafiğini önlemek için önemlidir.
Sık Yapılan Hatalar ve Kaçınılması Gerekenler
- Interceptor'ları yanlış sırada eklemek: Hata işleme interceptor'ları en son eklenmelidir.
- Token'ı global değişkende tutmak: Token güvenli bir şekilde saklanmalı, örneğin
flutter_secure_storageile. - Zaman aşımı sürelerini çok kısa tutmak: Mobil ağ koşulları için minimum 10 saniye önerilir.
- Her istekte yeni Dio örneği oluşturmak: Tek bir Dio örneği kullanarak bağlantı havuzundan yararlanın.
Kontrol Listesi
- Dio tek örnek (singleton) olarak yapılandırıldı mı?
- Tüm hata durumları (401, 500, timeout vb.) interceptor ile yönetiliyor mu?
- Token yenileme mekanizması ve logout senaryosu test edildi mi?
- İsteklerde uygun zaman aşımı değerleri kullanılıyor mu?
- CancelToken ile kullanıcı terk ettiğinde istek iptal ediliyor mu?
- Veri modeli dönüşümleri için transformer kullanılıyor mu?
- Yeniden deneme stratejisi (retry) yalnızca geçici hatalar için uygulanıyor mu?
Bu ipuçlarını uygulayarak Flutter uygulamanızın ağ katmanını daha güvenilir ve bakımı kolay hale getirebilirsiniz.
Sık Sorulan Sorular
Dio nedir ve neden Flutter'da tercih edilir?
Dio, Dart için güçlü bir HTTP istemci kütüphanesidir. Interceptor, yeniden deneme, zaman aşımı ve dosya yükleme gibi gelişmiş özellikler sunar. Basit http paketine göre daha esnek ve ölçeklenebilir bir ağ katmanı sağlar.
Dio'da interceptor nasıl kullanılır?
Interceptor'lar, istek ve yanıtları merkezi olarak işlemenizi sağlar. Örneğin, her isteğe token eklemek, hata durumlarını loglamak veya 401 hatasında token yenilemek için kullanılır. InterceptorsWrapper sınıfı ile kolayca eklenir.
Dio ile zaman aşımı nasıl ayarlanır?
BaseOptions içinde connectTimeout ve receiveTimeout parametreleri ile zaman aşımı süreleri ayarlanır. Örneğin: connectTimeout: Duration(seconds: 10). Aşım durumunda DioException fırlatılır.
Dio'da istek yeniden deneme (retry) nasıl yapılır?
Dio_interceptor paketi (dio_smart_retry gibi) veya özel bir interceptor yazılarak yeniden deneme yapılabilir. Genellikle 5xx hataları veya timeout durumlarında 2-3 kez deneme yapmak iyi bir pratiktir.






