BLoC — nedir, Flutter'da Business Logic Component

Yazar: IT Sectr Yayınlanma: 2026-02-19 Okuma süresi: 7 dk

BLoC (Business Logic Component) — Google tarafından 2018'de DartConf'ta tanıtılan Flutter için bir durum yönetimi desenidir. BLoC, reaktif akışlar (Stream) aracılığıyla iş mantığını kullanıcı arayüzünden ayırır: UI bir Event gönderir, BLoC onu işler ve Stream aracılığıyla yeni bir State döndürür. pub.dev'e göre, flutter_bloc paketi 11 binden fazla beğeni almış ve binlerce Flutter uygulamasında kullanılmaktadır.

Ana noktalar

  • Event — bir eylemi tanımlayan giriş sinyali: düğmeye basma, veri yükleme
  • State — UI çıkış durumu: veri yüklendi, hata, yükleniyor
  • Bloc — Event'i alan ve Stream aracılığıyla State döndüren ana sınıf
  • Cubit — Event'siz Bloc'un basitleştirilmiş sürümü, işlevleri doğrudan çağırır
  • BlocProvider — Bloc'u widget ağacına enjekte etmek için Flutter widget'ı

BLoC nedir?

BLoC (Business Logic Component) — iş mantığının UI'dan ayrılmış ayrı bir sınıfa çıkarıldığı Flutter için bir mimari desendir. BLoC, olay akışı (Event) aracılığıyla giriş verilerini alır ve durum akışı (State) aracılığıyla çıkış verilerini üretir. Sunum katmanı (Widget) yalnızca State akışına abone olur ve UI'yı işler, asla doğrudan iş mantığını yürütmez.

BLoC konsepti reaktif programlama ve Observer desenine dayanır. Her BLoC bileşeni, net bir sözleşmeye sahip ayrı bir modüldür: bilinen bir Event kümesi (ne olabilir) ve bilinen bir State kümesi (ne görüntülenebilir). Bir geliştirici UI'dan "yanlışlıkla" durumu değiştiremez — yalnızca belirli bir Event aracılığıyla. Bu, kodu öngörülebilir ve test edilebilir kılar.

Flutter Community 2025 anketine göre BLoC, Provider'dan sonra Flutter'da durum yönetimi çözümleri arasında popülerlikte ikinci sırada yer almaktadır. Başlıca avantajlar: güçlü tipleme, mantık izolasyonu, yerleşik Stream desteği, zengin yardımcı program ekosistemi (BlocProvider, BlocListener, BlocSelector).

BLoC mimarisi: Event → Bloc → State

BLoC mimarisi üç varlık etrafında inşa edilmiştir: Event (giriş), Bloc (işleyici) ve State (çıkış). Widget, add() yöntemi aracılığıyla bir Event gönderir. Bloc, Event'i mapEventToState veya on<Event> yönteminde alır, iş mantığını yürütür ve yield aracılığıyla yeni bir State yayar. Widget, Stream aracılığıyla State'i alır ve yeniden oluşturur.

Dart
abstract class CounterEvent {}

class Increment extends CounterEvent {}
class Decrement extends CounterEvent {}

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0);

  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    if (event is Increment) {
      yield state + 1;
    } else if (event is Decrement) {
      yield state - 1;
    }
  }
}

Tip güvenliği: Bloc, iki türle parametrelendirilir — Event ve State. Dart derleyicisi, Widget'ın yalnızca bildirilen Event'leri çağırdığını ve Bloc'un yalnızca bildirilen State'leri döndürdüğünü kontrol eder. "Bilinmeyen eylem" gibi çalışma zamanı hataları ortadan kaldırılır.

Close ve Dispose: Bloc, Closeable arayüzünü uygular. Bir widget yok edildiğinde, Bloc otomatik olarak close() yöntemi aracılığıyla Stream'i kapatır. Reaktif abonelik sızıntıları imkansızdır — BlocProvider, Bloc'un yaşam döngüsünü yöneterek onu bir rotaya veya sayfaya bağlar.

Bloc ve Cubit: karşılaştırma

Cubit, flutter_bloc 6.0 paketinde tanıtılan, Event olmadan Bloc'un basitleştirilmiş bir uygulamasıdır. Cubit, Event sınıfları yerine doğrudan yöntemler bildirir: increment(), fetchData(). Dahili olarak Cubit, aynı Stream tabanlı mekanizmayı kullanır ancak Event katmanını gizler. Bu, basit senaryolar için kalıp kodu %40-50 oranında azaltır.

ÖzellikBlocCubit
Event sınıflarıZorunluGerekmez
Kalıp koduYüksekDüşük
Eylem takibiEvent türü aracılığıylaYalnızca yöntem adı
İçin uygunKarmaşık senaryolarBasit durumlar
AnalitikEvent ile otomatikManuel

Cubit ne zaman seçilmeli: 2-3 değişkenli durum (loading, loaded, error), basit formlar, sayaçlar, UI durumları (açık/kapalı). Bloc ne zaman seçilmeli: çok sayıda eylem içeren karmaşık iş mantığı: sipariş işleme, yetkilendirme, veri senkronizasyonu. Bloc, Event aracılığıyla her eylemin ayrıntılı izlemesini sağlar — her çağrı BlocObserver'a kaydedilir.

BlocObserver — uygulamadaki tüm Bloc ve Cubit'leri izleyen küresel bir gözlemcidir. Event, State, hatalar ve geçişleri günlüğe kaydetmeye olanak tanır. Yalnızca bir örnek bağlayın: Bloc.observer = AppBlocObserver() ve tüm uygulama durumu izlemesi merkezi olarak kullanılabilir.

BlocProvider ve BlocBuilder

BlocProvider — alt widget'lara Bloc sağlayan flutter_bloc kaynaklı bir InheritedWidget'dır. Bir widget başlatıldığında, BlocProvider bir Bloc oluşturur ve yok edildiğinde — close() aracılığıyla otomatik olarak kapatır. BlocProvider, MaterialApp düzeyinde (küresel Bloc) veya belirli bir rota düzeyinde (yerel Bloc) yerleştirilebilir.

Dart
BlocProvider(
  create: (context) => CounterBloc(),
  child: Column(
    children: [
      BlocBuilder<CounterBloc, int>(
        builder: (context, state) => Text('$state'),
      ),
      ElevatedButton(
        onPressed: () => context.read<CounterBloc>().add(Increment()),
        child: Text('+'),
      ),
    ],
  ),
)

BlocBuilder — her yeni State'te UI'yı yeniden oluşturan bir widget'tır. BlocListener — yan etkiler için (UI'yı yeniden oluşturmadan bir State'i bir kez işleme): SnackBar gösterme, başka bir ekrana geçiş yapma. BlocConsumer — hem yeniden oluşturma hem de yan etkinin gerekli olduğu durumlar için Builder ve Listener'ın birleşimi. BlocSelector — State'in belirli bir alanı değiştiğinde yalnızca seçici yeniden oluşturma için.

MultiBlocProvider — iç içe geçme düzeylerini artırmadan iç içe BlocProvider'lar için bir widget'tır. 10-15 Bloc içeren bir Flutter uygulaması, tüm uygulama için kullanılabilir tüm Bloc'ları (AuthenticationBloc, CartBloc, SettingsBloc) kaydetmek üzere kök düzeyinde MultiBlocProvider kullanır.

BLoC test etme

BLoC test edilir Flutter widget'ları olmadan izole olarak. Yalnızca Dart paketi flutter_test ve bloc_test paketini içe aktarın. Test senaryosu: Bloc oluştur, Event ekle, State'i kontrol et. blocTest — build → act → expect sırasını otomatikleştiren bir yardımcı programdır.

Dart
blocTest<CounterBloc, int>(
  'emits [1] when Increment is added',
  build: () => CounterBloc(),
  act: (bloc) => bloc.add(Increment()),
  expect: () => [1],
)

Mocking: Bir depoya veya API'ye bağımlı olan Bloc, mocktail aracılığıyla mock'larla test edilir. Depo, soyutlama düzeyinde mocklanır ve Bloc, kurucu aracılığıyla mocklanmış bağımlılıkları alır. Hydrated Bloc — yerel depoda otomatik durum kalıcılığı/geri yüklemesi için bir uzantıdır. HydratedBlocStorage ve geçici dosya depolama ile test edilir.

Üretimde BLoC

Klasörler ve dosyalar: BLoC ile tipik bir Flutter proje yapısı: bloc/counter_bloc.dart, bloc/counter_event.dart, bloc/counter_state.dart. 30+ ekran için özellik tabanlı gruplama önerilir: features/auth/bloc/, features/cart/bloc/. Her Bloc ayrı bir dosyadır, her Event ve State — ya ayrı dosyalarda ya da Bloc ile aynı dosyada.

Performans: BLoC, boş Stream'ler için ek yük oluşturmaz. BlocBuilder, yeniden oluşturmaları filtrelemek için buildWhen kullanır — widget yalnızca belirli bir koşul değiştiğinde güncellenir. Close, etkin olmayan Bloc'ların bellek tüketmemesini sağlar. Flutter DevTools'a göre BLoC, paket boyutuna %1'den az ekler.

Provider'dan geçiş: BLoC, aynı projede Provider ile kolayca bir arada bulunur. Kademeli geçiş: önce en karmaşık Provider'ları Bloc ile değiştirin, ardından geri kalanını. BlocProvider, Provider ağacıyla uyumludur: eski widget'lar Provider'ı, yenileri — BlocProvider'ı, aynı uygulama içinde kullanabilir.

Sıkça sorulan sorular

BLoC, Flutter'da Provider'dan nasıl farklıdır?

BLoC, iş mantığı izolasyonu ve güçlü tipleme için Event + Stream kullanır. Provider, basit bağımlılık enjeksiyonu ve ChangeNotifier için InheritedWidget etrafında bir sarmalayıcıdır. BLoC, birden çok durum içeren karmaşık senaryolar için daha iyidir, Provider — yerel UI durumu için. BLoC daha fazla kalıp kodu gerektirir ancak Event aracılığıyla tam izlenebilirlik sağlar.

Hydrated Bloc nedir?

Hydrated Bloc, son State'i yerel depolamaya (varsayılan olarak Hive) otomatik olarak kaydeden hydrated_bloc paketinden bir uzantıdır. Uygulama yeniden başlatıldığında, Bloc başlangıç durumu yerine kaydedilmiş durumu geri yükler. Bu, manuel kaydetme çağrıları olmadan kalıcılık sorununu çözer: oturum açma, sepet, ayarlar oturumlar arasında otomatik olarak kaydedilir.

BLoC'da hatalar nasıl ele alınır?

BLoC'da bir hata, mapEventToState veya on<Event> içinde try-catch aracılığıyla ele alınır. Hata durumunda, Bloc bir hata State'i döndürür: yield LoadError(error.message). UI'da, BlocListener veya BlocConsumer, State'i hata türü için kontrol eder ve bir SnackBar veya iletişim kutusu gösterir. BlocObserver, işlenmeyen tüm istisnaları küresel olarak günlüğe kaydeder.

BLoC diğer çerçevelerle kullanılabilir mi?

BLoC, Dart Stream ve Flutter widget'larını kullandığı için Flutter'a özgü bir desendir. Event → Bloc → State konsepti AngularDart ve Server-side Dart için uyarlanabilir, ancak temel ekosistem (BlocProvider, BlocBuilder, BlocObserver) Flutter'a bağlıdır. React Native için Redux veya MobX kullanın; SwiftUI için Combine + MVVM kullanın.

Ne seçilmeli: Bloc mu Cubit mi?

Cubit — basit durumlar için (sayaç, toggle, 2-3 alanlı form). Bloc — karmaşık mantık için (haber akışı, sipariş işleme, yetkilendirme). Ana kural: analitik veya hata ayıklama için her eylemin (Event) izlenmesine ihtiyacınız varsa — Bloc'u seçin. Durumu değiştiren yöntemler yeterliyse — Cubit'i seçin. Her iki desen de aynı projede bir arada bulunabilir.

Özet

  • BLoC — Event → Stream → State aracılığıyla Flutter durum yönetimi deseni
  • Event — eylem (basma, yükleme), State — tepki (veri, hata, yükleniyor)
  • Cubit — Event'siz basitleştirilmiş sürüm, %50'ye kadar daha az kalıp kodu
  • BlocProvider — otomatik kapatma ile widget ağacına Bloc enjeksiyonu
  • BlocObserver — uygulamadaki tüm Bloc ve Cubit'lerin küresel izlenmesi
  • Hydrated Bloc — Hive aracılığıyla otomatik durum kalıcılığı
  • blocTest — Flutter'dan izole Bloc birim testi için yardımcı program

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun