Riverpod vs Bloc Karşılaştırması

Az kodla derleme-zamanı güvenli, hızlı gelişen provider mimarisi

VS
Bloc

Event/state akışını zorunlu kılan, olgun ve topluluk-büyük mimari sözleşmesi

10 dk okumaCross-Platform

Hızlı Karar

"Yanlış seçim" yok — ikisi de kanıtlanmış, MIT lisanslı. 1-5 kişilik, hızlı iterasyon yapan ekipte Riverpod: az boilerplate, codegen isteğe bağlı, çok aktif sürüm temposu (3.4.3, 2026-09-03). Çok ekipli, denetlenebilir olay akışı isteyen kurumsal projede Bloc: event/state zorunlu, BlocObserver var, ama flutter_bloc'un son sürümü 2025-05-02 tarihli — izle. Soru "hangisi iyi" değil, "disiplin ne kadar dışarıdan dayatılmalı" sorusu.

RiverpodBloc
Tam sonucu oku

Puan Karşılaştırması

Grafik yükleniyor...

Detaylı Puanlama

Detaylı Puanlama: Riverpod ve Bloc — kategori bazında 10 üzerinden puanlar
KategoriRiverpodBloc
Performans
8/10
8/10
Öğrenme Kolaylığı
8/10
6/10
Ekosistem
7/10
9/10
Topluluk
7/10
9/10
İş Pazarı
7/10
7/10
Gelecek
8/10
7/10

Artıları & Eksileri

Riverpod

Artıları

  • Code generation tamamen opsiyonel — klasik syntax ile de yazılabilir
  • Tek kavram (Provider/Ref) etrafında öğrenme eğrisi düşük
  • ProviderContainer.test() ile ekstra paket gerekmeden izole unit test
  • BuildContext'e bağımlı olmadan provider okunabiliyor
  • DevTools eklentisi riverpod paketiyle birlikte geliyor (extension/devtools, v1.0.0)
  • Riverpod 3.0 ile deneysel mutations ve riverpod_sqflite offline persistence
  • pub.dev'de ayda 2.970.654 indirme ile yüksek aktif kullanım
  • 2026-09-03'te çıkan 3.4.3 sürümüyle çok aktif geliştirme temposu

Eksileri

  • Klasik syntax ile code-gen syntax'ı arasında hangisini seçeceğine ekip kendi karar vermeli
  • GitHub yıldızı (7.375) Bloc'un gerisinde — daha genç bir topluluk
  • pub.dev pub point'i (140/160) Bloc'un tam puanının gerisinde
  • Mimari sözleşme dayatmıyor — büyük ekipte tutarlılık ekip disiplinine kalıyor
  • Codegen kullanıldığında build_runner zincirine bağımlılık oluşuyor
  • Codegen'siz unified syntax henüz RFC aşamasında, kararlı değil

En Uygun

1-5 kişilik küçük ekipler ve hızlı MVP/startup iterasyonuZaten Freezed veya json_serializable kullanan projelerOffline-first veya deneysel state mutation ihtiyaçları olan uygulamalarAz boilerplate ve tek kavramla hızlı öğrenme isteyen ekiplerAktif/güncel bir bağımlılık zincirini önceliklendiren projeler

Bloc

Artıları

  • Event/state ayrımı zorunlu — rastgele yerden state mutasyonu mümkün değil
  • BlocObserver ile her state geçişi merkezi olarak loglanabiliyor
  • Üç katmanlı mimari (Presentation/Business Logic/Data) resmi olarak belgeli
  • pub.dev'de 160/160 tam pub point ve resmi 'Flutter Favorite' rozeti
  • GitHub'da 12.482 yıldızla daha büyük ve köklü bir topluluk
  • blocTest ile build/act/expect kalıbında tutarlı, okunabilir testler
  • Bloc-to-Bloc Communication ile çok-katmanlı, çok-repository kompozisyon resmi destekli
  • pub.dev'de wasm-ready ve platform:web etiketleriyle web hedefinde olgun

Eksileri

  • Basit bir ekran için bile ayrı event/state sınıfları yazmak gerekiyor
  • bloc_test paketi ve ayrı bir test DSL'i (blocTest) öğrenmek gerekiyor
  • flutter_bloc son sürümü 2025-05-02 — 16+ aydır yeni sürüm almadı
  • build_runner tabanlı resmi code generator yok; boilerplate azaltımı resmi IntelliJ/VSCode eklentilerinin şablon üretimine dayanıyor
  • provider paketine (BlocProvider temeli) yapısal bağımlılık kaldırılamıyor
  • Repository/DataProvider constructor kurulumu resmi dokümanda net örneklenmiyor

En Uygun

10+ geliştiricili, çok modüllü kurumsal projelerDenetlenebilirlik/uyumluluk gereken regüle sektörler (fintech, sağlık)Junior ağırlıklı ekiplerde zorunlu mimari sözleşmeye ihtiyaç duyan projelerTest tutarlılığını code review'da otomatik sağlamak isteyen ekiplerUzun vadeli, olgun ve büyük bir topluluğa dayanmak isteyen projeler

Kod Karşılaştırması

Riverpod
// Riverpod - Kullanıcı listesi (code generation ile)
// Kaynak: riverpod.dev resmi doküman deseni
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'user_list_provider.g.dart';

@riverpod
Future<List<User>> userList(Ref ref, {required int page}) async {
  final repository = ref.watch(userRepositoryProvider);
  return repository.fetchUsers(page: page);
}

class UserListScreen extends ConsumerWidget {
  const UserListScreen({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final usersAsync = ref.watch(userListProvider(page: 1));

    return usersAsync.when(
      data: (users) => ListView.builder(
        itemCount: users.length,
        itemBuilder: (context, index) => ListTile(
          title: Text(users[index].name),
          subtitle: Text(users[index].email),
        ),
      ),
      loading: () => const Center(child: CircularProgressIndicator()),
      error: (error, stack) => Center(child: Text('Hata: $error')),
    );
  }
}

// Codegen'siz klasik syntax alternatifi (resmi doküman, opsiyonel):
final userListClassicProvider =
    FutureProvider.autoDispose.family<List<User>, int>((ref, page) async {
  final repository = ref.watch(userRepositoryProvider);
  return repository.fetchUsers(page: page);
});
Bloc
// Bloc - Kullanıcı listesi (Event/State + Repository)
// Kaynak: bloclibrary.dev resmi Core Concepts deseni
import 'package:flutter_bloc/flutter_bloc.dart';

sealed class UserListEvent {}

class FetchUsers extends UserListEvent {
  FetchUsers({required this.page});
  final int page;
}

sealed class UserListState {}

class UserListInitial extends UserListState {}

class UserListLoading extends UserListState {}

class UserListLoaded extends UserListState {
  UserListLoaded({required this.users});
  final List<User> users;
}

class UserListError extends UserListState {
  UserListError({required this.message});
  final String message;
}

class UserListBloc extends Bloc<UserListEvent, UserListState> {
  UserListBloc({required this.repository}) : super(UserListInitial()) {
    on<FetchUsers>(_onFetchUsers);
  }

  final UserRepository repository;

  Future<void> _onFetchUsers(
    FetchUsers event,
    Emitter<UserListState> emit,
  ) async {
    emit(UserListLoading());
    try {
      final users = await repository.fetchUsers(page: event.page);
      emit(UserListLoaded(users: users));
    } catch (error) {
      emit(UserListError(message: error.toString()));
    }
  }
}

Sonuç

"Yanlış seçim" yok — ikisi de kanıtlanmış, MIT lisanslı. 1-5 kişilik, hızlı iterasyon yapan ekipte Riverpod: az boilerplate, codegen isteğe bağlı, çok aktif sürüm temposu (3.4.3, 2026-09-03). Çok ekipli, denetlenebilir olay akışı isteyen kurumsal projede Bloc: event/state zorunlu, BlocObserver var, ama flutter_bloc'un son sürümü 2025-05-02 tarihli — izle. Soru "hangisi iyi" değil, "disiplin ne kadar dışarıdan dayatılmalı" sorusu.

Ücretsiz Danışmanlık Al
SSS

Sıkça Sorulan Sorular

Tekil doğru cevap yok. 1-5 kişilik ekipte hızlı iterasyon yapıyorsan ve mimari kararı ekip içi konuşmayla çözebiliyorsan Riverpod (az boilerplate, codegen isteğe bağlı, BuildContext'siz test) daha uygun. Çok ekipli, denetlenebilir bir olay akışı ve katı sözleşme isteyen kurumsal projede (fintech, sağlık gibi regüle sektörlerde) Bloc, event/state ayrımını ve BlocObserver ile merkezi loglamayı zorunlu kılarak daha güvenli bir zemin sunuyor.

Giriş

Flutter 3.47'nin (12 Ağu 2026) Material/Cupertino'yu standalone pakete taşıması, her Flutter ekibini önümüzdeki çeyrekte widget katmanına dokunmaya itiyor — bu göç penceresi, state katmanı kararını da yeniden masaya getiriyor. Riverpod ve Bloc, ekosistemin en olgun iki state management çözümü — ikisi de MIT lisanslı, açık kaynak paketler. Ama felsefeleri kökten farklı: Riverpod az kodla derleme-zamanı güvenliği vaat eden, Remi Rousselet öncülüğünde yürüyen aktif bir proje; Bloc ise event-state akışını zorunlu kılan, "junior-dostu, disiplin dayatan" bir mimari. Sayılar da bu farkı doğruluyor: Bloc GitHub'da 12.482 yıldızla Riverpod'un 7.375'inin önünde, ama pub.dev'de flutter_riverpod 2026-09-03'te sürüm alırken flutter_bloc 2025-05-02'den beri sessiz. Bu sayfa tek bir tavsiyeye değil, ekibinin gerçeğine götürüyor: boilerplate'den test kurulumuna, DevTools'tan mimari disipline altı boyutta ikisini karşılaştırıyoruz — her iddia resmi doküman, pub.dev ve GitHub API'siyle doğrulanmış.

Karşılaştırma Matrisi

Karşılaştırma Matrisi: Riverpod / Bloc
ÖzellikRiverpodBloc
İlk yayın2020 (0.0.1-pre)2018 (0.1.0)
Güncel sürüm tarihi2026-09-03 (Öne çıkan)2025-05-02
GitHub yıldız7.37512.482 (Öne çıkan)
pub.dev pub point140/160160/160 (Öne çıkan)
pub.dev like sayısı2.9058.074 (Öne çıkan)
30 günlük indirme2.970.654 (Öne çıkan)1.876.379
Flutter Favorite rozetiYokVar (Öne çıkan)
Code generationOpsiyonelbuild_runner codegen yok; resmi CLI bloc_tools 0.1.0-dev.24 var
Test paketi bağımlılığıGerekmez (ProviderContainer.test) (Öne çıkan)bloc_test şart
Mimari sözleşmeEsnek (Provider ağacı)Zorunlu (Event/State/3 katman)
DevTools entegrasyonuriverpod paketiyle gelen DevTools eklentisi (v1.0.0; riverpod.dev'de dokümante değil)BlocObserver (resmi, ayrı DevTools yok)
LisansMITMIT
Web/WASM etiketi (pub.dev)pub.dev etiketi yok (paket saf Dart; etiket eksikliği pubspec analiz çıktısı)wasm-ready, platform:web (Öne çıkan)

Derinlemesine İnceleme

Riverpod

Genel Bakış

Riverpod, Remi Rousselet (rrousselGit) tarafından geliştirilen ve flutter_riverpod paketiyle ilk kez 2020-05-16'da pub.dev'de yayınlanan bir state management çözümü. Provider paketinin yazarı tarafından, Provider'ın BuildContext bağımlılığını aşmak için tasarlandı. Provider'ları widget ağacından bağımsız, derleme-zamanında güvenli bir grafik olarak tanımlamanı sağlıyor — test için widget kurmana gerek kalmıyor, doğrudan ProviderContainer üzerinden okuyabiliyorsun. Code generation tamamen opsiyonel: riverpod_generator ve riverpod_annotation ile @riverpod annotation'ını kullanabilir, ya da klasik Provider/StateNotifierProvider sözdizimiyle codegen'siz yazabilirsin. Güncel sürüm 3.4.3 (2026-09-03); 3.0 ile deneysel mutations API'si ve riverpod_sqflite ile offline persistence eklendi. Paket MIT lisanslı; GitHub'da 7.375 yıldız, pub.dev'de ayda 2.970.654 indirme.

Ekosistem

Paket yöneticisi
pub.dev (pub)
Geliştirme ortamı
Android StudioVS CodeIntelliJ IDEA
Popüler kütüphaneler
riverpod_generatorriverpod_annotationhooks_riverpodriverpod_sqflite
GitHub yıldızı
7,375

Bloc

Genel Bakış

Bloc, Felix Angelov (felangel) tarafından geliştirilen ve flutter_bloc paketiyle ilk kez 2018-10-23'te pub.dev'de yayınlanan, event-driven bir state management mimarisi. Temel felsefesi, her state değişiminin açık bir event üzerinden tetiklenmesi. Resmi mimari dokümanı uygulamayı üç katmana ayırmayı öneriyor: Presentation (UI), Business Logic (Bloc/Cubit) ve Data (Repository/DataProvider). Test için resmi bloc_test paketini (sürüm 10.0.0) kullanman gerekiyor; blocTest(...) build/act/expect üçlüsüyle event-state akışını doğruluyor. BlocObserver ise her state geçişini merkezi olarak loglayan resmi bir gözlemci deseni. Bloc pub.dev'de 160/160 tam pub point'e ve 'Flutter Favorite' rozetine sahip; GitHub'da 12.482 yıldız ve 3.421 fork'la Riverpod'dan büyük bir topluluğa dayanıyor. flutter_bloc'un son sürümü 2025-05-02 tarihli (9.1.1); core bloc paketi 2026-05-12'de 9.2.1 ile güncellendi.

Ekosistem

Paket yöneticisi
pub.dev (pub)
Geliştirme ortamı
Android StudioVS CodeIntelliJ IDEA
Popüler kütüphaneler
blocflutter_blocbloc_testhydrated_bloc
GitHub yıldızı
12,482

Teknik Analiz

Boilerplate ve Code Generation Bağımlılığı

Riverpod'un resmi dokümanı tek bir fonksiyon gösteriyor: FutureProvider.autoDispose.family<User, int>((ref, userId) async {...}) — ayrı sınıf, event, state tanımı gerekmiyor. Bloc'ta ise resmi "Core Concepts" örneği seni ayrı bir sealed class CounterEvent, iki alt-event sınıfı ve ayrı bir CounterBloc extends Bloc<CounterEvent, int> sınıfı yazmaya zorluyor. Bu fark kozmetik değil — Bloc mimarisi üç katman öngörüyor, her katman kendi sınıflarını istiyor. Code generation tarafında yollar ayrılıyor. Riverpod'un resmi SSS'si net: "code generation is completely optional" — ama başka code-gen araçları zaten kullanıyorsan Riverpod'unkini de öneriyor. Bunu riverpod_generator (4.0.9) ile build_runner üzerinden yapabilirsin; istemezsen klasik Provider sözdizimiyle codegen'siz de yazabilirsin. Bloc'ta build_runner tabanlı kod üretimi yok; bunun yerine bloclibrary.dev publisher'ı altında bloc_tools (0.1.0-dev.24) adlı resmi bir CLI var. Ayrıca resmi bloc_lint linter'ı ve iskelet üreten IntelliJ/VSCode eklentileri var. Kısacası: az kod istiyorsan Riverpod code-gen'i sağlar ama build_runner'a bağımlı kalırsın; Bloc'un event/state zorunluluğu satır sayısını yukarı çeker.

Test Edilebilirlik ve Kurulum Maliyeti

Riverpod'da test yazmak için ekstra bir paket kurman şart değil. Resmi test kılavuzu, ProviderContainer.test() ile izole bir unit test ortamı kurmanı öneriyor; container.read ve container.listen gibi API'ler package:test üzerine doğrudan oturuyor. Yeni bir DSL öğrenmene gerek yok — provider'ı okuyup değerini doğruluyorsun. Bloc'ta durum farklı. Resmi test kılavuzu seni doğrudan dart pub add dev:test dev:bloc_test komutuna yönlendiriyor ve testlerini blocTest(...) fonksiyonuyla, build/act/expect parametreleriyle yazmanı istiyor. Bu, öğrenilecek ayrı bir API demek — ama karşılığında testlerin, event akışını ve beklenen state dizisini açıkça belgeleyen, okunması kolay bir yapıya kavuşuyor. bloc_test paketi de aktif bakımlı (güncel sürüm 10.0.0). Senin için pratik sonuç şu: küçük bir ekipte hızlı test yazıp geçmek istiyorsan Riverpod'un "ekstra paket yok" yaklaşımı sürtünmeyi azaltıyor. Ama büyük bir ekipte test kod tabanının tutarlı bir formatta olmasını istiyorsan, blocTest'in dayattığı yapı (her testin build/act/expect üçlüsüyle yazılması) code review'ı kolaylaştırıyor — bu da Bloc'un "disiplini dışarıdan dayatma" karakterinin test katmanına yansıması.

DevTools, İzlenebilirlik ve Öğrenme Eğrisi

İzlenebilirlik tarafında her iki paket kendi felsefesine uygun bir çözüm sunuyor. Riverpod'un DevTools eklentisi riverpod paketinin içinde geliyor: deponun packages/riverpod/extension/devtools/config.yaml dosyası name: riverpod, version: 1.0.0 ve requiresConnection: true alanlarını taşıyor. Dikkat et — bu eklenti riverpod.dev dokümanında anlatılmıyor. Bloc ise ayrı bir DevTools eklentisi yerine, mimari dokümanında öne çıkan BlocObserver deseniyle çalışıyor: her state değişimini tek merkezden loglayabiliyorsun. Öğrenme eğrisinde Bloc net konumlanıyor: resmi "Why Bloc?" sayfası projeyi "Easy to understand & can be used by developers with varying skill levels" ilkesiyle tanımlıyor. Gerçek yüzeyde bir çelişki var: getting-started akışı beş ayrı kavram öğretiyor — Bloc, Cubit, Event, State, Repository — üstüne bloc_test DSL'i ekleniyor. Riverpod'da tek kavram var: Provider/Ref; dezavantajı klasik ve code-gen syntax arasındaki seçimi sana bırakması. Ekipte junior ağırlıklıysa ve "yanlış yapamayacakları" bir sözleşme istiyorsan, Bloc'un event/state ayrımı bunu zorunluluk olarak veriyor. Ekip küçükse, Riverpod'un tek-kavram yaklaşımı daha az sürtünmeyle öğreniliyor.

Büyük Uygulamada Ölçeklenme ve Modülerleşme

Bloc'un mimari dokümanı, büyük ve çok ekipli projeler için tasarlanmış bir sözleşme sunuyor: "Bloc-to-Bloc Communication" bölümü, birden fazla Bloc'un birbiriyle nasıl haberleşeceğini resmi olarak tarifliyor, çok-repository ve çok-katman kompozisyonuna izin veriyor. Bu, 10+ geliştiricili bir ekipte "kim hangi state'i nereden değiştiriyor" tartışmasını azaltan, denetlenebilir bir olay akışı sağlıyor. Riverpod tarafında ölçeklenme farklı bir eksende ilerliyor: daha az boilerplate ile daha çok otomasyon. Riverpod 3.0 ile gelen deneysel mutations özelliği ve resmi riverpod_sqflite paketiyle sağlanan offline persistence, büyüyen bir uygulamanın state yönetimini merkezi bir noktadan otomatikleştirmeyi hedefliyor. Modülerleşme burada "daha fazla sınıf yazarak" değil, "provider grafiğini genişleterek" sağlanıyor — her yeni özellik yeni bir provider, ama event/state ayrımı zorunlu değil. Kararını verirken şunu sor: ekibin büyüdükçe "kim neyi nasıl değiştirdi" sorusuna resmi bir sözleşmeyle mi cevap vermek istiyorsun (Bloc), yoksa az kodla genişleyen bir provider ağacını mı tercih ediyorsun (Riverpod)?

pub.dev Bakım Sıklığı ve Topluluk Büyüklüğü — Çelişkili Sinyal

Bu kriter sayfanın en özgün bulgusunu barındırıyor çünkü "topluluk büyüklüğü" tek bir sayıya indirgenemiyor — iki metrik tam ters yöne işaret ediyor. GitHub yıldızında Bloc önde: 12.482 yıldız, 3.421 fork, 86 açık issue. Riverpod ise 7.375 yıldız, 1.108 fork, 162 açık issue ile daha küçük bir topluluğa sahip. Bu tabloya bakarsan "Bloc daha popüler" sonucuna varırsın — rakip karşılaştırma yazılarının çoğu tam da burada duruyor. Ama pub.dev'in canlı sürüm verisi farklı bir hikaye anlatıyor. flutter_riverpod en son 2026-09-03'te 3.4.3 sürümünü çıkarmış; ondan önceki sürümler 2026-07-28 (3.4.2), 2026-07-26 (3.4.1) ve 2026-06-10 (3.3.2) tarihli — yani aylık ile iki aylık arasında değişen, süren bir döngü. flutter_bloc ise en son 2025-05-02'de 9.1.1 sürümüne ulaşmış; 16 aydan uzun süredir yeni bir sürüm almamış. Pub point tarafında da ilginç bir denge var: Bloc 160/160 tam puanla ve "Flutter Favorite" etiketiyle önde, Riverpod 140/160 ile geride — ama indirmede Riverpod ayda 2.970.654 ile Bloc'un 1.876.379'unun önünde. Sonuç: "hangisi daha popüler" sorusunun tek cevabı yok. Uzun vadeli bakım endişen varsa, yıldızdan çok son sürüm tarihine bak.

Ekipte Mimari Disiplini Dayatma Gücü

Bu son kriter yukarıdaki her şeyi bir araya getiriyor: hangisi ekibine daha fazla dış disiplin dayatıyor? Bloc'un cevabı net — event/state akışı zorunlu, üç katmanlı mimari (Presentation/Business Logic/Data) resmi olarak öngörülüyor, testler blocTest'in build/act/expect üçlüsüne oturuyor ve BlocObserver her state değişimini merkezi olarak loglayabiliyor. Bir geliştirici Bloc'ta "rastgele bir yerden state değiştiremiyor" — mimari buna izin vermiyor. Riverpod'da disiplin dışarıdan dayatılmıyor, ekibin kendi alışkanlığına bağlı kalıyor. Klasik syntax ile code-gen syntax'ı arasında seçim yapman gerekiyor (resmi doküman bu kararı sana bırakıyor), provider'ları nasıl organize edeceğin (feature-based, layer-based) senin kararın ve state mutasyonunu nereden yapacağın konusunda Bloc'taki gibi bir "duvar" yok. Bu esneklik hız kazandırıyor ama büyük, çok ekipli bir organizasyonda "herkes kendi yolunu seçer" riskini de beraberinde getiriyor. Pratik özet: dışarıdan gelen bir sözleşmeye ihtiyacın varsa (denetim, uyumluluk, büyük ve dağınık ekip) Bloc bu sözleşmeyi mimarinin kendisine gömüyor. Ekibin zaten disiplinliyse ve hıza öncelik veriyorsan, Riverpod'un esnekliği seni yavaşlatmıyor.

Hangi Senaryoda Hangisi

1-5 kişilik ekip, hızlı MVP/startup iterasyonu

Öneri: Riverpod

Az boilerplate, codegen isteğe bağlı, tek kavram (Provider) üzerinden hızlı öğreniliyor; ekip küçükken mimari sözleşmeye ihtiyaç azdır.

10+ geliştiricili, çok modüllü kurumsal proje

Öneri: Bloc

Event/state ayrımı ve üç katmanlı mimari resmi olarak zorunlu; büyük ekipte 'kim neyi nereden değiştirdi' sorusunu mimari kendisi çözüyor.

Junior ağırlıklı ekip, sıkı code review kapasitesi yok

Öneri: Bloc

Event/state akışı dışında bir yoldan state mutasyonu yapılamaz; blocTest'in build/act/expect kalıbı test tutarlılığını otomatik sağlar.

Denetlenebilirlik/uyumluluk (fintech, sağlık gibi regüle sektör)

Öneri: Bloc

BlocObserver ile her state geçişi merkezi olarak loglanabiliyor; production hatalarında izlenebilir bir kayıt bırakıyor.

Zaten Freezed/json_serializable kullanan bir ekip

Öneri: Riverpod

riverpod_generator aynı build_runner zincirine sürtünmesiz ekleniyor, ek bir araç öğrenme maliyeti çıkmıyor.

Offline-first veya deneysel mutation API'lerine ihtiyaç

Öneri: Riverpod

Riverpod 3.0 resmi olarak mutations (deneysel) ve riverpod_sqflite ile offline persistence sunuyor.

Paketin uzun vadeli aktif bakımı en önemli kriter

Öneri: Riverpod (dikkatli izle)

flutter_riverpod 2026-09-03'te sürüm aldı, flutter_bloc 2025-05-02'den beri sürüm almadı — ama Bloc'un 160/160 pub point'i olgunluk sinyali de olabilir, karar öncesi pub.dev'den güncel tarihi tekrar kontrol et.

Yaygın Tuzaklar

  • Riverpod'da provider dosyasını silip build_runner'ı yeniden çalıştırmadan bırakmak, 'unexpected error trying to get location information' gibi kafa karıştırıcı hatalara yol açıyor.

    Riverpod

    Çözüm

    Provider dosyalarını değiştirdikten sonra her seferinde build_runner'ı watch modunda çalıştırmayı alışkanlık haline getir; CI'da da build_runner adımını ayrı bir kontrol noktası yap.

  • build_runner çıktısındaki 'build completed' satırını tek başına yeşil ışık sayıp üretilen kodun gerçekten tazelendiğini kontrol etmemek.

    Riverpod

    Çözüm

    build_runner'ı --verbose ile çalıştır ve üretilen .g.dart dosyalarının zaman damgasına bak; dosyalar güncellenmemişse kodu değil, build zincirini incele.

  • Bloc'ta provider paketine (Provider pattern, BlocProvider'ın temeli) yapısal bağımlılık var; ekip bunu 'gereksiz bağımlılık' sanıp kaldırmaya çalışıyor ve widget ağacı kırılıyor.

    Bloc

    Çözüm

    BlocProvider'ın MultiProvider içinde çalışabilmesi için provider paketinin kalıcı bir bağımlılık olduğunu ekibe baştan belgele, kaldırmayı denemeyin.

  • Bloc'ta add() sonrası yayılan state dizisini klasik expect çağrılarıyla yakalamaya çalışmak; resmi test rehberi düz expect'i yalnız başlangıç state'i için kullanıyor, event akışı için bloc_test paketinin blocTest DSL'ini şart koşuyor.

    Bloc

    Çözüm

    Test bağımlılıklarını resmi rehberdeki gibi kur (dart pub add dev:test dev:bloc_test) ve event tetikleyen her senaryoyu blocTest(build/act/expect) ile yaz; düz expect'i yalnız başlangıç state'i doğrulaması için bırak.

  • flutter_bloc'un 16+ aydır sürüm almamış olmasını 'proje terk edildi' sanıp panikle migration'a karar vermek.

    Her ikisi

    Çözüm

    Karar vermeden önce pub.dev'de bloc (core) paketinin sürüm geçmişine bak (9.2.1, 2026-05-12) — core paket aktif, flutter_bloc'un durağanlığı API'nin olgunlaştığını gösteriyor olabilir; issue tracker'ı kontrol ederek teyit et.

Geçiş Kılavuzu

Bloc'tan Riverpod'a (ya da tersi) kademeli geçiş

Tahmini süre: Resmi/kaynaklı bir süre tahmini yok (ne Riverpod ne Bloc migration rehberi yayınlıyor); topluluk pratiği modül başına birkaç gün ile birkaç hafta arasında değişen kademeli bir süreç öneriyor — kesin süre proje büyüklüğüne göre değişir.
  1. 1Mevcut event/state (Bloc) veya provider (Riverpod) haritasını çıkar — hangi modüller en az bağımlılığa sahip, oradan başla.
  2. 2Domain/business logic katmanını (repository, use-case) hiç dokunmadan bırak; yalnız widget-tree'ye state expose eden katmanı değiştir.
  3. 3İlk modülü seç-uygula: küçük, izole bir özellik (örn. ayarlar ekranı) üzerinde yeni paketi dene.
  4. 4Test kapsamını yeni pakete taşırken eski testleri silme — geçici olarak iki test takımını (blocTest / ProviderContainer.test) paralel çalıştır.
  5. 5Ekip içi bir 'geçiş rehberi' dokümanı yaz: hangi pattern nereye taşınıyor, kod inceleme sırasında referans olarak kullanılsın.
  6. 6Ekran ekran veya modül modül taşı — büyük bir modülü tek seferde dönüştürmek yerine riski böl.
  7. 7Her modül geçişi sonrası regresyon testi çalıştır ve mevcut state akışının davranışsal olarak aynı kaldığını doğrula.
  8. 8Geçiş tamamlanana kadar iki paketin bir arada bulunmasını (mixed state) resmi kabul et — bu geçici durum normaldir, hızlandırmak için zorlama.

Gelecek Öngörüsü

Riverpod

Riverpod, 3.0 hattında deneysel mutations API'si ve riverpod_sqflite ile offline persistence gibi özellikleri resmi olarak genişletiyor; 2026-09-03'te 3.4.3 sürümü çıktı ve son dört sürümün tarihleri (2026-06-10, 2026-07-26, 2026-07-28, 2026-09-03) aylık–iki aylık bir tempoya işaret ediyor. Riverpod tarafında ayrıca codegen'siz 'unified syntax' için açık RFC tartışmaları sürüyor (issue #4008 ve #4752) — kararlı bir tarih yok, ama yön code-gen/klasik syntax ayrımını azaltmaya doğru.

Bloc

Core bloc paketinin 2026-05-12'de 9.2.1'e güncellenmesi ekosistemin aktif kaldığını gösteriyor, ancak flutter_bloc'un 16+ aydır sürüm almaması ya API'nin olgunlaştığını ya da geliştirme temposunun yavaşladığını gösterebilir.

Altın Bilgi

GitHub yıldızı seni yanıltabilir. Bloc, 12.482 yıldızla Riverpod'un 7.375'inin neredeyse iki katına sahip — sathi bakışta "daha popüler, daha güvenli" diye düşünürsün. Ama pub.dev'in canlı sürüm geçmişi tersini gösteriyor: flutter_riverpod 2026-09-03'te sürüm çıkarmış, flutter_bloc ise son sürümünü 16 aydan uzun süre önce (2025-05-02) yayınlamış. Bunun anlamı "Bloc kötü" değil — 160/160 pub point ve "Flutter Favorite" rozeti olgunluğa da işaret ediyor olabilir. Ders şu: bir paketi değerlendirirken yıldız, like, indirme hacmi VE son sürüm tarihini birlikte oku; en çok gözden kaçırılan sinyal, pub.dev API'sinden gelen "son sürüm ne zaman çıktı" sorusudur.

İlgili Blog Yazıları

Tüm Yazıları Gör
Tüm Karşılaştırmalar

İlgili İçerik