Add BLoC

pull/3/head
Jonas Franz 2 years ago
parent 898e1aedf8
commit 3068e29648
Signed by: JonasFranzDEV
GPG Key ID: 7293A220B7C38080
  1. 29
      bibliography.bib
  2. 38
      chapters/basics/state-management.tex
  3. 7
      frontbackmatter/Acronyms.tex
  4. 1
      hdathesis-config.tex

@ -90,12 +90,12 @@ isbn="978-981-15-1465-4"
}
@MastersThesis{reactNativeVsFlutter,
type={Bachelorthesis},
author = {Wu, Wenhao},
school = {Metropolia University of Applied Sciences},
title = {{React Native vs Flutter, cross-platform mobileapplication frameworks}},
year = {2018},
month = mar,
type = {Bachelorthesis},
}
@Misc{dartTypes,
@ -115,11 +115,30 @@ isbn="978-981-15-1465-4"
}
@Misc{inheritedModel,
author = {{Google LLC}},
title = {InheritedModel class - widgets library - Dart API},
year = {2021},
author = {{Google LLC}},
title = {InheritedModel class - widgets library - Dart API},
year = {2021},
url = {https://api.flutter.dev/flutter/widgets/InheritedModel-class.html},
urldate = {2022-01-23},
url = {https://api.flutter.dev/flutter/widgets/InheritedModel-class.html},
}
@phdthesis{Faust,
type = {Bachelor Thesis},
author = {Sebastian Faust},
title = {Using Google´s Flutter Framework for the Development of a Large-Scale Reference Application},
url = {https://nbn-resolving.org/urn:nbn:de:hbz:832-epub4-14989},
pages = {85},
abstract = {With Google’s Flutter framework continuing to grow in popularity for companies and developers alike, the need for an understanding of how to utilize the framework in a large-scale context has become more relevant than ever. The purpose of this thesis is to document the crucial steps most development teams using Flutter in a large-scale application will face. Additionally, a fully documented, large-scale reference application was generated so that other developers may use it as an aid when creating their own Flutter projects on a similar scale. Multiple steps were taken to ensure that optimal solutions were chosen for each aspect of the development process. For each of those aspects, a wide range of possible solutions were explored, compared and analysed. Finally, one of the possible solutions was chosen based on a wide range of scientific papers and community-generated sources. Additionally, an interview with an expert in the field was conducted to further validate those decisions. After the application was fully implemented, ten crucial aspects of the development process were identified. Those ten aspects are now explained in detail in this thesis. Ultimately, the knowledge provided by this thesis can act as a map for peers using Flutter in a large-scale context and help them overcome the crossroads they will most likely come to face.},
language = {en}
}
@Conference{blocTalk,
author = {Paolo Soares},
booktitle = {DartConf 2018},
title = {{Flutter / AngularDart – Code sharing, better together}},
year = {2018},
url = {https://www.youtube.com/watch?v=PLHln7wHgPE},
urldate = {2022-01-23},
}
@Comment{jabref-meta: databaseType:bibtex;}

@ -24,10 +24,12 @@ Beide Sichtweisen haben gemein, dass die Grundaufgabe der Zustandsverwaltung die
Nachdem nun eingeführt wurde, was unter einer Zustandsverwaltung in Flutter zu verstehen ist, werden nun mögliche bestehende Ansätze für eine Zustandsverwaltung skizziert, um im weiteren Verlauf der Ausarbeitung im Analyse- und Evaluationskapitel diese eingehender zu untersuchen.
\subsection{Mitgelieferte Werkzeuge}
\label{chap:included}
Die erste Kategorie der Zustandsverwaltungssysteme umfasst jene, welche ohne eine zusätzliche Bibliothek auskommen und somit de facto im Flutter Framework mitgeliefert werden. Hierbei wird mit den einfacheren Konzepten und Werkzeugen begonnen und anschließend die komplexeren Konzepte und Werkzeuge vorgestellt.
\subsubsection{setState}
\label{chap:setState}
Die wohl grundlegendeste Möglichkeit, den Zustand in einer Flutter Anwendung zu verwalten stellt das ausschließliche Benutzen der \texttt{setState}-Methode dar. Ein Beispiel zur Verwendung wurde bereits in \autoref{lst:stateful} in der \texttt{incrementCounter}-Methode eingeführt. Hier findet die Speicherung des Zustands also durch die direkte Manipulation des States von StatefulWidgets statt.
@ -43,6 +45,7 @@ Wie vorausgehend beschrieben, muss ein Zustandsverwaltungssystem aber nicht nur
Anschaulich lässt sich dies durch das Beispiel \autoref{fig:flutterTreeSetState} darstellen, welches eine Anwendung, die global speichern muss, welche Person aktuell angemeldet ist, zeigt. Da diese Information in diesem Beispiel an diversen Stellen innerhalb der Anwendung benötigt wird, macht es Sinn, diese Information weit oben im Baum in Form eines \texttt{StatefulWidget} namens \texttt{LoginStateWidget} zu speichern, da der Datenfluss innerhalb des Baums ausschließlich unidirektional von oben nach unten stattfindet. Um diese Information nun an die Widgets zu kommunizieren, die es benötigen - in diesem Fall \texttt{InformationConsumer} - muss \texttt{LoginStateWidget} die Information per Konstruktor an das nachgelagerte Widget weitergeben. Diese nachgelagerten Widgets (\texttt{A, B, C}) müssen dies ebenfalls tun, bis die Information am Ziel \texttt{InformationConsumer} angekommen ist. Diese Anwendungsmuster wird in der Literatur als \blockquote[{\cite[Kap.8.2]{flutterinaction}}]{lifting state up} bezeichnet.
 \subsubsection{InheritedWidget}
\label{chap:inheritedWidget}
Neben der Möglichkeit, den Zustand über den Widget-Baum nach unten weiter zu propagieren, bietet Flutter noch das Konzept \texttt{InheritedWidget} an. Diese Widgets bilden eine eigene Widget-Gruppe und sind weder den \texttt{StatefulWidgets} noch den \texttt{StatelessWidgets} zuzuordnen. \autocite[Kap.8.2.1]{flutterinaction} \texttt{InheritedWidgets} ermöglichen es nachgeordneten Widgets, auf den Zustand des Widgets direkt zuzugreifen. Hier muss allerdings beachtet werden, dass das \texttt{InheritedWidget} immer unveränderlich ist. Dies bedeutet, dass andere Widgets über die Veränderung von Konstruktor-Parametern neue Instanzen des Widgets erstellen müssen, um eine Zustandsänderung zu bewirken. Daher lassen sich diese Widgets oft in Kombination mit \texttt{StatefulWidgets}, welche für die Manipulation des Zustands zuständig sind, vorfinden.
@ -77,4 +80,37 @@ Dieser Mechanismus wird auch von diversen anderen Zustandsverwaltungssystemen ve
Als Erweiterung des \texttt{InheritedWidget} kann man \texttt{InheritedModel} sehen. Dabei ist die Funktionsweise äquivalent mit einer Besonderheit. Es besteht hier nämlich die Möglichkeit Zugriffe und Änderungen nach sogenannten \texttt{aspects} zu kategorisieren. Somit kann bei komplexeren Zuständen es ermöglicht werden, dass Widgets nur dann neugebaut werden, wenn der betreffende \text{aspect} sich ändert. \autocite{inheritedModel}
\subsubsection{BLoC}
\subsection{\acf{bloc}}
Das 2018 auf der Entwicklerkonferenz DartConf vorgestellte \ac{bloc}-Pattern ist im Vergleich zu den bisher vorgestellten Ansätzen ein Design-Pattern zur Verwaltung von Zuständen und nicht nur ein Werkzeug des Frameworks. Das Ziel von \ac{bloc} ist es, die komplette Logik von der Benutzeroberfläche zu trennen. \autocite[S.17]{Faust} Die Logik und der Zustand wird dabei in den namensgebenden \acf{bloc} verwaltet. Die Komponenten haben die Aufgabe, Zustands-Ereignisse von Widgets zu empfange und Widgets zu aktualisieren, wenn sich der Zustand ändert. Diese Komponenten unterliegen grundlegenden, nicht-verhandelbaren Regeln, welche im Vortrag von \citeauthor{blocTalk} definiert worden sind:
\blockquote[{\cite[24:04]{blocTalk}}]{\begin{enumerate}
\item Inputs and outputs are simple Streams/Sink only
\item Dependencies must be injectable and platform agnostic
\item No platform branching allowed [...]
\end{enumerate}}
Die erste Regel bedeutet, dass \ac{bloc} weder Methoden noch Variablen nach außen freigeben dürfen, sondern nur über \texttt{Stream}s und \texttt{Sink}s mit Widgets kommunizieren. Ein \texttt{Stream} ist dabei in Flutter ein asynchroner Fluss von Daten oder Ereignissen. Widgets können diesen Ereignissfluss abonnieren und werden dann aktualisiert, wenn sich dieser ändert. Ein \texttt{Sink} ist intern auch eine Art von Stream, welcher aber die Besonderheit hat, dass man von außen neue Ereignisse hinzufügen kann. Über diesen \texttt{Sink} lassen sich also Daten und Ereignisse an das \ac{bloc} übergeben.
Die zweite Regel sagt aus, dass \ac{bloc} keine Abhängigkeiten zur Benutzeroberfläche haben dürfen. Selbst das Importieren von Flutter-Bibliotheken in diese Dateien ist verboten. Damit wird erreicht, dass \ac{bloc} komplett plattformunabhängig sind, und somit die komplette Benutzeroberfläche theoretisch ersetzt werden könnte, ohne die Logik ändern zu müssen.
Die dritte Regel legt fest, dass innerhalb von \ac{bloc}s keine Unterscheidungen zwischen Betriebssystemen oder Plattformen vorgenommen werden darf.
Der innere Aufbau der \ac{bloc} ist explizit nicht vorgeschrieben, dient aber dazu die über die \texttt{Sink}s eingehenden Daten und Ereignisse zu verarbeiten und anschließend den neuen Zustand über die \texttt{Stream}s zurück an die Widgets zu propagieren. Technisch kommen hier oft Techniken und Werkzeuge aus der reaktiven Programmierung wie \texttt{RxDart} zum Einsatz.
Jede Seite (engl. Screen) sollte dabei exakt einem \ac{bloc} zugeordnet sein. Damit die Widgets auf diesen \ac{bloc} zugreifen können, müssen diese \texttt{injectable} sein - also zwischen mehreren Widgets geteilt. Dies kann unter anderem mit den bereits in \autoref{chap:included} vorgestellten Ansätzen umgesetzt werden.
\subsubsection{Cubit}
\subsection{Provider}
\subsection{Riverpod}
\subsection{Redux}
\subsection{GetIt}
\subsection{MobX}
\subsection{Binder}

@ -10,10 +10,7 @@
\chapter*{Abk\"{u}rzungsverzeichnis}
% Insert your acronyms here
\begin{acronym}[UML]
\acro{DRY}{Don't Repeat Yourself}
\acro{API}{Application Programming Interface}
\acro{UML}{Unified Modeling Language}
\begin{acronym}[BLoC]
\acro{bloc}[BLoC]{Business Logic Components}
\end{acronym}
\cleardoublepage

@ -45,3 +45,4 @@
%\PassOptionsToPackage{spanish,es-lcroman}{babel}
\usepackage{babel}
\usepackage{acronym}
Loading…
Cancel
Save