BLoC — was ist das, Business Logic Component in Flutter

Autor: IT Sectr Veröffentlicht: 2026-02-19 Lesezeit: 7 Min.

BLoC (Business Logic Component) — ein Zustandsverwaltungsmuster für Flutter, vorgestellt von Google im Jahr 2018 auf der DartConf. BLoC trennt die Geschäftslogik von der Benutzeroberfläche durch reaktive Streams (Stream): Die UI sendet ein Event, BLoC verarbeitet es und gibt einen neuen State über Stream zurück. Laut pub.dev hat das Paket flutter_bloc über 11.000 Likes erhalten und wird in tausenden Flutter-Anwendungen eingesetzt.

Wichtige Punkte

  • Event — Eingangssignal, das eine Aktion beschreibt: Tastendruck, Daten laden
  • State — Ausgangszustand der UI: Daten geladen, Fehler, lädt
  • Bloc — Hauptklasse, die Event empfängt und State über Stream zurückgibt
  • Cubit — vereinfachte Version von Bloc ohne Event, die Funktionen direkt aufruft
  • BlocProvider — Flutter-Widget zum Injizieren von Bloc in den Widget-Baum

Was ist BLoC?

BLoC (Business Logic Component) — ein Architekturmuster für Flutter, bei dem die Geschäftslogik in eine separate Klasse ausgelagert wird, die von der UI isoliert ist. BLoC empfängt Eingabedaten über einen Stream von Ereignissen (Event) und erzeugt Ausgabedaten über einen Stream von Zuständen (State). Die Präsentationsschicht (Widget) abonniert lediglich den State-Stream und rendert die UI, ohne jemals direkt Geschäftslogik auszuführen.

Das BLoC-Konzept basiert auf reaktiver Programmierung und dem Observer-Muster. Jede BLoC-Komponente ist ein separates Modul mit einem klaren Vertrag: eine bekannte Menge von Events (was passieren kann) und eine bekannte Menge von States (was angezeigt werden kann). Ein Entwickler kann den Zustand nicht "versehentlich" von der UI aus ändern — nur über ein bestimmtes Event. Dies macht den Code vorhersagbar und testbar.

Laut der Flutter Community 2025-Umfrage belegt BLoC den zweiten Platz in der Beliebtheit bei Zustandsverwaltungslösungen in Flutter nach Provider. Hauptvorteile: starke Typisierung, Logikisolierung, integrierte Stream-Unterstützung, reichhaltiges Ökosystem an Dienstprogrammen (BlocProvider, BlocListener, BlocSelector).

BLoC-Architektur: Event → Bloc → State

Die BLoC-Architektur ist um drei Entitäten herum aufgebaut: Event (Eingabe), Bloc (Verarbeiter) und State (Ausgabe). Das Widget sendet ein Event über die Methode add(). Bloc empfängt das Event in der Methode mapEventToState oder on<Event>, führt die Geschäftslogik aus und gibt einen neuen State über yield aus. Das Widget empfängt den State über einen Stream und baut neu auf.

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;
    }
  }
}

Typsicherheit: Bloc ist mit zwei Typen parametrisiert — Event und State. Der Dart-Compiler überprüft, dass das Widget nur deklarierte Events aufruft und Bloc nur deklarierte States zurückgibt. Laufzeitfehler wie "unbekannte Aktion" sind ausgeschlossen.

Close und Dispose: Bloc implementiert das Interface Closeable. Wenn ein Widget zerstört wird, schließt Bloc automatisch den Stream über die Methode close(). Lecks bei reaktiven Abonnements sind unmöglich — BlocProvider verwaltet den Lebenszyklus von Bloc und bindet ihn an eine Route oder Seite.

Bloc und Cubit: Vergleich

Cubit ist eine vereinfachte Implementierung von Bloc ohne Event, eingeführt im Paket flutter_bloc 6.0. Cubit deklariert Methoden direkt anstelle von Event-Klassen: increment(), fetchData(). Intern verwendet Cubit denselben Stream-basierten Mechanismus, verbirgt jedoch die Event-Ebene. Dies reduziert den Boilerplate um 40-50% für einfache Szenarien.

EigenschaftBlocCubit
Event-KlassenErforderlichNicht nötig
BoilerplateHochNiedrig
AktionsverfolgungÜber Event-TypNur Methodenname
Geeignet fürKomplexe SzenarienEinfache Zustände
AnalytikAutomatisch per EventManuell

Wann Cubit wählen: Zustand mit 2-3 Varianten (loading, loaded, error), einfache Formulare, Zähler, UI-Zustände (offen/geschlossen). Wann Bloc wählen: Komplexe Geschäftslogik mit vielen Aktionen: Bestellabwicklung, Autorisierung, Datensynchronisation. Bloc bietet detaillierte Verfolgung jeder Aktion durch Event — jeder Aufruf wird in BlocObserver protokolliert.

BlocObserver — ein globaler Beobachter, der alle Bloc und Cubit in der Anwendung verfolgt. Er ermöglicht die Protokollierung von Event, State, Fehlern und Übergängen. Einfach eine Instanz anschließen: Bloc.observer = AppBlocObserver(), und die gesamte Zustandsverfolgung der Anwendung ist zentral verfügbar.

BlocProvider und BlocBuilder

BlocProvider — ein InheritedWidget aus flutter_bloc, das child-Widgets einen Bloc bereitstellt. Bei der Initialisierung eines Widgets erstellt BlocProvider einen Bloc und schließt ihn bei Zerstörung automatisch über close(). BlocProvider kann auf MaterialApp-Ebene (globaler Bloc) oder auf einer bestimmten Route (lokaler Bloc) platziert werden.

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 — ein Widget, das die UI bei jedem neuen State neu aufbaut. BlocListener — für Seiteneffekte (einen State einmal verarbeiten, ohne die UI neu aufzubauen): SnackBar anzeigen, zu einem anderen Bildschirm navigieren. BlocConsumer — eine Kombination aus Builder und Listener für Fälle, in denen sowohl ein Neubau als auch ein Seiteneffekt benötigt werden. BlocSelector — für selektiven Neubau nur bei Änderung eines bestimmten State-Feldes.

MultiBlocProvider — ein Widget für verschachtelte BlocProvider ohne Erhöhung der Verschachtelungsebene. Eine Flutter-Anwendung mit 10-15 Blocs verwendet MultiBlocProvider auf der Root-Ebene, um alle Blocs zu registrieren, die der gesamten Anwendung zur Verfügung stehen: AuthenticationBloc, CartBloc, SettingsBloc.

BLoC testen

BLoC wird isoliert ohne Flutter-Widgets getestet. Einfach das Dart-Paket flutter_test und das Paket bloc_test importieren. Das Testszenario: Bloc erstellen, Event hinzufügen, State überprüfen. blocTest — ein Dienstprogramm, das die Sequenz automatisiert: build → act → expect.

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

Mocking: Ein Bloc, der von einem Repository oder einer API abhängt, wird mit Mocks über mocktail getestet. Das Repository wird auf Abstraktionsebene gemockt, und der Bloc erhält die gemockten Abhängigkeiten über den Konstruktor. Hydrated Bloc — eine Erweiterung zur automatischen Zustandsspeicherung/-wiederherstellung im lokalen Speicher. Es wird mit HydratedBlocStorage und temporärem Dateispeicher getestet.

BLoC in der Produktion

Ordner und Dateien: Eine typische Flutter-Projektstruktur mit BLoC: bloc/counter_bloc.dart, bloc/counter_event.dart, bloc/counter_state.dart. Für 30+ Bildschirme wird eine feature-basierte Gruppierung empfohlen: features/auth/bloc/, features/cart/bloc/. Jeder Bloc ist eine separate Datei, jedes Event und jeder State — entweder in separaten Dateien oder in einer Datei mit dem Bloc.

Leistung: BLoC erzeugt keinen Overhead für leere Streams. BlocBuilder verwendet buildWhen zum Filtern von Neubauten — das Widget wird nur aktualisiert, wenn sich eine bestimmte Bedingung ändert. Close stellt sicher, dass inaktive Blocs keinen Speicher verbrauchen. Laut Flutter DevTools fügt BLoC weniger als 1% zur Bündelgröße hinzu.

Migration von Provider: BLoC koexistiert problemlos mit Provider im selben Projekt. Schrittweise Migration: zuerst die komplexesten Provider durch Bloc ersetzen, dann die restlichen. BlocProvider ist mit dem Provider-Baum kompatibel: alte Widgets können Provider verwenden, neue — BlocProvider, innerhalb einer einzigen Anwendung.

Häufig gestellte Fragen

Wie unterscheidet sich BLoC von Provider in Flutter?

BLoC verwendet Event + Stream zur Isolierung der Geschäftslogik und starken Typisierung. Provider ist ein Wrapper um InheritedWidget für einfache Abhängigkeitsinjektion und ChangeNotifier. BLoC eignet sich besser für komplexe Szenarien mit mehreren Zuständen, Provider — für lokale UI-Zustände. BLoC erfordert mehr Boilerplate, bietet aber vollständige Rückverfolgbarkeit durch Events.

Was ist Hydrated Bloc?

Hydrated Bloc ist eine Erweiterung aus dem Paket hydrated_bloc, die automatisch den letzten State im lokalen Speicher (standardmäßig Hive) speichert. Beim Neustart der Anwendung stellt Bloc den gespeicherten Zustand statt des Anfangszustands wieder her. Dies löst das Persistenzproblem ohne manuelle Speicheraufrufe: Login, Warenkorb, Einstellungen werden automatisch zwischen Sitzungen gespeichert.

Wie behandelt man Fehler in BLoC?

Ein Fehler in BLoC wird durch try-catch innerhalb von mapEventToState oder on<Event> behandelt. Bei einem Fehler gibt Bloc einen Fehler-State zurück: yield LoadError(error.message). In der UI überprüft BlocListener oder BlocConsumer den State auf den Fehlertyp und zeigt einen SnackBar oder Dialog an. BlocObserver protokolliert global alle unbehandelten Ausnahmen.

Kann BLoC mit anderen Frameworks verwendet werden?

BLoC ist ein Flutter-spezifisches Muster, da es Dart Stream und Flutter-Widgets verwendet. Das Konzept Event → Bloc → State kann für AngularDart und Server-side Dart angepasst werden, aber das Kernökosystem (BlocProvider, BlocBuilder, BlocObserver) ist an Flutter gebunden. Für React Native verwenden Sie Redux oder MobX, für SwiftUI — Combine + MVVM.

Was wählen: Bloc oder Cubit?

Cubit — für einfache Zustände (Zähler, Toggle, Formular mit 2-3 Feldern). Bloc — für komplexe Logik (Nachrichtenfeed, Bestellabwicklung, Autorisierung). Die Hauptregel: Wenn Sie eine Verfolgung jeder Aktion (Event) für Analysen oder Debugging benötigen — wählen Sie Bloc. Wenn Methoden, die den Zustand ändern, ausreichen — wählen Sie Cubit. Beide Muster können im selben Projekt koexistieren.

Zusammenfassung

  • BLoC — Flutter Zustandsverwaltungsmuster über Event → Stream → State
  • Event — Aktion (drücken, laden), State — Reaktion (Daten, Fehler, lädt)
  • Cubit — vereinfachte Version ohne Event, bis zu 50% weniger Boilerplate
  • BlocProvider — Bloc-Injektion in den Widget-Baum mit automatischem Close
  • BlocObserver — globale Überwachung aller Bloc und Cubit in der Anwendung
  • Hydrated Bloc — automatische Zustandspersistenz über Hive
  • blocTest — Dienstprogramm für Unit-Tests von Bloc isoliert von Flutter

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch