Flutter BloC Pattern 1

Las Vegas
Bei grösseren Projekten stellt sich die Frage, wie man das State - Management lösen möchte.  Wer schon seine ersten Schritte mit Flutter gemacht hat, weiß, das es Widgets ohne State gibt und solche mit. Ein Umgang mit diesen Stateful Widgets, wird schnell zur zentralen Frage bei der Softwareentwicklung mit Flutter.

Basis BloC


Es gibt verschiedene Konzepte um mit dem State umzugehen, diese stehen nicht in Konkurrenz. Es ist an dem Entwickler, sich für ein Konzept zu entscheiden, je nach den erwarteten Erfordernissen der geplanten Software.
BloC steht für Business Logic Component und ermöglicht das Handling der State's.
Es wird gerne als Pattern bezeichnet, also als Muster, mit welchem wir den Umgang mit einem State konzipieren. Die hinter BloC ist die Trennung der Präsentation (UI / StatelessWidgets) von der Logic (StatefulWidgets). Das heißt der Button, den wir in der App drücken, muss nichts darüber wissen, was nach dem drücken passiert. In einem Fall wird man vielleicht auf eine neue Seite geleitet, in einem anderen Fall wird zum Beispiel nur eine Zahl erhöht. Damit kann man diesen Button leicht wiederverwenden, ein erwünschter Effekt von BloC.

Wie funktioniert nun ein BloC ?


Ein BloC nimmt Ereignisse auf, Events, verarbeitet sie gemäß einer Logik, und gibt einen State aus. Im Falle des Button, ist das drücken das Ereignis und die Reaktion darauf, der von BloC ausgegebene State. Wie die BloC Einheit das Ereignis behandelt ist dementsprechend die Logik.


Ein einfaches Beispiel


Am Besten lernt man das Konzept hinter BloC mit "learning by doing". Als Basis für ein einfaches Beispiel nehmen wir den Boiler Code, den uns Visual Studio Code / Android Studio vorgibt. Wir implementieren einen zweiten Button. Der erste addiert, der zweite subtrahiert. Des weiteren ergänzen wir den setState Teil im Code um eine Variante für die Subtraktion.


Nichts weltbewegendes also. Der Beispielcode generiert also zwei Ereignisse, entweder Addition oder Subtraktion. Er hat auch zwei mal eine Verarbeitung, zwei mal die setState Funktion. Jetzt wollen wir dieses Beispiel abändern. Als erstes benötigen wir zwei weitere Files:

zaehler_ereignis.dart und zaehler_bloc.dart

Im ersteren erstellen wir eine abstrakte Klasse, die wir im weiteren Verlauf benötigen. In zaehler_bloc.dart programmieren wir den Mechanismus für den BloC.

Kernbestandteil ist der StreamController. Wer mehr dazu wissen möchte, liest am besten die Dokumentation dazu. Kurz gesagt ist es ein Datenstrom der Daten aufnimmt (sink) und Daten ausgibt (stream). In unserem Beispiel ist der sink "privat", der stream aber "öffentlich". Die Werte die über den "sink" eintreffen, werden unverändert über den "stream" wieder ausgegeben. Mit diesem Controller, stream, erfahren wir also den Wert der Variable zaehler. Jetzt brauchen wir noch einen Controller der die Addition - und Subtraktionsereignisse aufnimmt.
Nun haben wir zwei Controller. Ihre Funktion:
  • mit dem StateController überwachen wir die Variable
  • mit dem EventController verarbeiten wir die Ereignisse
Um die Ereignisse von dem EventController zu verarbeiten, müssen wir auf ihn "hören". Das wir im Konstruktor von ZaehlerBloc implementiert:

Am Schluss schließen wir mit dispose noch die zwei Controller. Man beachte das im Konstruktor jetzt die Ereignisse verarbeitet werden.

Was ist noch zu tun ?


Jetzt muss noch der Code im main.dart File angepasst werden. Wir müssen einen StreamBuilder einbauen und den onPressed Code ändern. Wer den originalen Boilerplate Code anschaut, wird den Aufwand sicher für übertrieben halten. Schliesslich funktionieren beide Versionen. Wer sich aber vor Augen führt das bei einem grösseren Projekt einige, und vor allem, an verschiedene State's zu verarbeiten sind, wird das Konzept zu schätzen wissen. Wer mag..hier noch der komplette Code.

Kommentare

Beliebte Posts aus diesem Blog

Material Design in Flutter Teil 2

Dart Basic: Listen Part 1

Listen in Dart (2021): Part 1 List.filled List.empty und List.add