Flutter uygulamalarında durum yönetimi, ölçeklenebilir ve bakımı kolay bir kod tabanı için kritik öneme sahiptir. Provider, uzun süre popüler bir seçenek olsa da Riverpod, daha modern ve esnek bir alternatif olarak öne çıkıyor. Bu yazıda Riverpod'un temel bileşenlerini, Provider'a kıyasla avantajlarını ve pratik bir geçiş kontrol listesini bulacaksınız.
Riverpod Nedir ve Neden Tercih Edilmeli?
Riverpod, Flutter ekosisteminde durum yönetimi için geliştirilmiş, compile-safe ve test edilebilir bir kütüphanedir. Provider'ın aksine bağımlılıkları çalışma zamanında değil, derleme zamanında çözer. Bu sayede ProviderNotFoundException gibi hatalarla karşılaşmazsınız. Ayrıca Riverpod, durumun yaşam döngüsünü daha iyi yönetir ve widget ağacından bağımsız çalışır.
Temel Riverpod Bileşenleri
Riverpod'un dört temel provider türü vardır:
- Provider: Salt okunur değerler için. Örneğin bir sabit liste veya hesaplanmış değer.
- StateProvider: Basit durum parçaları için (int, string gibi).
- StateNotifierProvider: Karmaşık durum mantığı için. Bir StateNotifier sınıfı ile birlikte kullanılır.
- FutureProvider: Asenkron veri yükleme işlemleri için (API çağrıları gibi).
Bu bileşenler sayesinde durumu modüler bir şekilde yönetebilir, her bir provider'ı bağımsız olarak test edebilirsiniz.
Provider'dan Riverpod'a Geçiş: Adım Adım Kontrol Listesi
Aşağıdaki adımları takip ederek mevcut bir Flutter projesini Provider'dan Riverpod'a taşıyabilirsiniz:
- Adım 1: Bağımlılıkları ekleyin –
pubspec.yamldosyasınaflutter_riverpodveriverpodpaketlerini ekleyin. - Adım 2: Provider'ları dönüştürün – Her bir
ChangeNotifierProvider'ı ilgili Riverpod provider'ı ile değiştirin. Çoğu durumdaStateNotifierProviderkullanılır. - Adım 3: Context'i kaldırın – Riverpod'da provider'lara erişmek için
context.readveyacontext.watchyerineref.readveyaref.watchkullanılır. Widget'larınızıConsumerWidgetveyaConsumerile sarın. - Adım 4: ProviderScope ekleyin – Uygulamanızın en üst seviyesine
ProviderScopewidget'ını yerleştirin. - Adım 5: Testleri güncelleyin – Riverpod'da testler daha basittir. Provider'ları override ederek izole testler yazabilirsiniz.
Riverpod ile Pratik İpuçları
1. Provider'ları Modüler Tutun
Her provider yalnızca bir sorumluluğa sahip olmalıdır. Örneğin kullanıcı oturumu, ürün listesi ve favoriler için ayrı provider'lar oluşturun. Bu sayede React'teki durum yönetimi prensiplerine benzer şekilde kodunuzu temiz tutabilirsiniz.
2. Asenkron Durumları FutureProvider ile Yönetin
API çağrıları gibi asenkron işlemler için FutureProvider kullanın. Bu provider, yükleme, hata ve veri durumlarını otomatik olarak yönetir. Örneğin:
final userProvider = FutureProvider((ref) async {
final repository = ref.watch(userRepositoryProvider);
return repository.fetchUser();
});
3. Aile (Family) Provider ile Parametrik Durum
Aynı türden birden fazla durum parçasına ihtiyacınız varsa (örneğin her ürün için ayrı detay), Family modifier'ını kullanın. Bu, her bir parametre için ayrı bir provider örneği oluşturur.
4. Test Edilebilirliği Artırma
Riverpod'da test yazmak için ProviderContainer kullanarak provider'ları override edebilirsiniz. Örneğin bir API servisini mock'lamak için:
final container = ProviderContainer(
overrides: [
userRepositoryProvider.overrideWithValue(MockUserRepository()),
],
);
Bu yaklaşım, UI testlerinde olduğu gibi birim testlerde de büyük kolaylık sağlar.
5. Performans İyileştirmeleri
ref.watch yerine ref.listen kullanarak yalnızca belirli durum değişikliklerini dinleyin. Ayrıca autoDispose modifier'ı ile kullanılmayan provider'ları bellekten temizleyin. Bu sayede bildirimsel UI framework'leri ile uyumlu bir performans elde edersiniz.
Sık Yapılan Hatalar ve Kaçınılması Gerekenler
- ProviderScope'u unutmak – Uygulamanızın çalışması için en üst seviyede
ProviderScopeolmalıdır. - StateNotifier içinde mutable durum kullanmak – Durumu her zaman
copyWithveya yeni bir örnek oluşturarak güncelleyin. - Provider'ları widget ağacına bağlamak – Riverpod'da provider'lar global olduğu için widget'tan bağımsızdır. Bu alışkanlıktan vazgeçin.
Riverpod ile Geleceğe Hazır Olun
Riverpod, Flutter'ın gelecekteki sürümleriyle uyumlu olacak şekilde tasarlanmıştır. Provider'dan geçiş yapmak başlangıçta zaman alsa da, daha temiz ve test edilebilir bir kod tabanına sahip olmanızı sağlar. Ayrıca Riverpod'un sağladığı araçlar sayesinde hata ayıklama süreci büyük ölçüde kolaylaşır.
Projenizde Riverpod'u denemek için küçük bir özellikle başlayın. Zamanla tüm durum yönetimini bu modern kütüphaneye taşıyabilirsiniz. Unutmayın, doğru araç seçimi uzun vadede size zaman kazandırır.
Sık Sorulan Sorular
Riverpod ve Provider arasındaki temel fark nedir?
Riverpod, Provider'ın aksine compile-safe'dir ve widget ağacına bağımlı değildir. Provider'da context üzerinden erişim gerekirken Riverpod'da ref kullanılır. Ayrıca Riverpod daha modüler ve test edilebilirdir.
Riverpod'da StateNotifierProvider ne zaman kullanılır?
Karmaşık durum mantığı ve metodlar içeren yapılar için StateNotifierProvider kullanılır. Örneğin bir sepete ürün ekleme/çıkarma işlemleri bu provider ile yönetilir.
Riverpod'da asenkron veri nasıl yönetilir?
Async değerler için FutureProvider veya StreamProvider kullanılır. Bu provider'lar yükleme, hata ve veri durumlarını otomatik olarak yönetir.
Riverpod performans açısından Provider'dan daha mı iyi?
Riverpod, gereksiz yeniden yapılanmaları engelleyerek ve autoDispose ile bellek yönetimini iyileştirerek genellikle daha iyi performans sunar. Ancak her iki kütüphane de doğru kullanıldığında yeterlidir.
Mevcut bir Flutter projesini Riverpod'a geçirmek zor mu?
Başlangıçta bazı değişiklikler gerektirse de adım adım geçiş yapmak mümkündür. Önce küçük bir modülü dönüştürüp test ederek başlayabilirsiniz.






