From 747034a340a6eb9997aaaee4dc1d7f8b1eb04f05 Mon Sep 17 00:00:00 2001 From: Jonas Franz <jonas.franz@incloud.de> Date: Sun, 23 Jan 2022 11:47:06 +0100 Subject: [PATCH] Add statemenegment --- chapters/basics/basics.tex | 3 +- chapters/basics/flutter.tex | 41 +++++++++++++++++------- chapters/basics/setState_tree.png | Bin 0 -> 21559 bytes chapters/basics/state-management.tex | 45 +++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 chapters/basics/setState_tree.png create mode 100644 chapters/basics/state-management.tex diff --git a/chapters/basics/basics.tex b/chapters/basics/basics.tex index f755cc6..a03b657 100644 --- a/chapters/basics/basics.tex +++ b/chapters/basics/basics.tex @@ -2,4 +2,5 @@ In diesem Kapitel werden für die weitere Evaluation benötigte Grundlagen vermittelt. Dabei wird sowohl auf bestehende Literatur eingegangen als auch an Hand von Beispielen Konzepte erläutert. -\input{chapters/basics/flutter.tex} \ No newline at end of file +\input{chapters/basics/flutter.tex} +\input{chapters/basics/state-management.tex} \ No newline at end of file diff --git a/chapters/basics/flutter.tex b/chapters/basics/flutter.tex index d9b8478..254d4f6 100644 --- a/chapters/basics/flutter.tex +++ b/chapters/basics/flutter.tex @@ -56,11 +56,37 @@ In Flutter wird bei Widgets grundsätzlich zwischen \texttt{StatelessWidget} und Ein \texttt{StatelessWidget} hat grundsätzlich keinen veränderbaren Zustand. Dies heißt, dass alle Klassenvariablen unveränderlich sein sollen. In Dart wird dies mit dem Modifikator \texttt{final} gekennzeichnet. Daraus wird impliziert, dass alle Informationen zum Zustand des Widgets aus den im Konstruktor übergebenen werten stammen müssen. Somit wird das Widget nur neu gebaut, wenn sich Änderungen an den Werten des Konstruktors durch Änderungen in der Hierarchie darüber liegenden Widgets ergeben. -Ein \texttt{StatefulWidget} auf der anderen Hand besteht aus zwei Klassen. Zum einen dem \texttt{StatefulWidget} zum anderen dem \texttt{State} dieses Widgets. Diese Widgets vereinen die Möglichkeiten eines \texttt{StatelessWidget} mit der Möglichkeit, den Zustand des Widgets selbstständig zu verändern. Dies wäre beispielsweise bei einem Textfeld relevant, wenn der Text geändert wird. Zustandsänderungen werden dabei über die, wie in \autoref{lst:stateful} gezeigte, \texttt{setState} Methode vorgenommen, damit auch die Änderung an das Framework kommuniziert wird. +Ein \texttt{StatefulWidget} auf der anderen Hand besteht aus zwei Klassen. Zum einen dem \texttt{StatefulWidget} zum anderen dem \texttt{State} dieses Widgets. Diese Widgets vereinen die Möglichkeiten eines \texttt{StatelessWidget} mit der Möglichkeit, den Zustand des Widgets selbstständig zu verändern. Dies wäre beispielsweise bei einem Zähler relevant, wenn der Zähler erhöhrt werden soll. Zustandsänderungen werden dabei über die, wie in \autoref{lst:stateful} gezeigte, \texttt{setState} Methode vorgenommen, damit auch die Änderung an das Framework kommuniziert wird. Intern wird dabei das Widget als \texttt{dirty} markiert, welches dazu führt, dass die Build-Methode des States erneut aufgerufen wird durch das Framework. Entscheidend ist dabei, dass der State persistent bleibt, auch wenn sich beispielsweise Konstruktor-Parameter der \texttt{StatefulWidget}-Klasse ändern. \begin{lstlisting}[caption={StatefulWidget}, label={lst:stateful}] - UI Widget(state) TODO +class Counter extends StatefulWidget { + const Counter({Key? key}) : super(key: key); + + @override + State<Counter> createState() => _CounterState(); +} + +class _CounterState extends State<Counter> { + int _counter = 0; + + void _incrementCounter() { + setState(() { + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text("Count: $_counter"), + IconButton(icon: Icon(Icons.add), + onPressed: _incrementCounter), + ], + ); + } +} \end{lstlisting} \begin{wrapfigure}{r}{0.33\textwidth} @@ -72,13 +98,6 @@ Ein \texttt{StatefulWidget} auf der anderen Hand besteht aus zwei Klassen. Zum e Durch die Kombination von diversen Widgets entsteht so ein Widget-Baum, wie in \autoref{fig:flutterTree} zu sehen ist. Dieser Baum lässt sich auch mittels Hilfswerkzeugen traversieren, ist aber von der Grundstruktur für einen unidirektionalen Datenfluss ausgelegt. Dies bedeutete, dass Widgets nur untergeordnete Widgets durch Änderung derer Zustände verändern können sollen. Übergeordnete Widgets können somit - jedenfalls nicht direkt - verändert werden. -Zusammenfassend wird festgehalten, dass der Zustand und die Verwaltung des Zustands von Widgets einen wichtigen Teil im Lebenszyklus einer Flutter-Anwendung ist. - -Was ist Flutter? - -Wie funktioniert Flutter? - -Wie ist die Architektur eine Flutter Anwendung? - -Wie funktioniert Testing unter Flutter? +Anders als bei der nativen Entwicklung, wird hier also die Benutzeroberfläche deklarativ programmiert. Bei der Entwicklung wird also festgelegt, wie welches Element bei welchem Zustands auszusehen hat, ohne dabei den Kontrollfluss beschreiben zu müssen. +Zusammenfassend wird festgehalten, dass der Zustand und die Verwaltung des Zustands von Widgets einen wichtigen Teil im Lebenszyklus einer Flutter-Anwendung ist. Dies gibt schon einen Vorgriff darauf, dass hier eine Lösung gefunden werden muss, welche auf diverse Szenarien anwendbar sein muss. diff --git a/chapters/basics/setState_tree.png b/chapters/basics/setState_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..e7952a61f9a8b881d3e546ae1160ba74d503360b GIT binary patch literal 21559 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 XT2!TPzo4zP00000NkvXXu0mjf#>}$7 literal 0 HcmV?d00001 diff --git a/chapters/basics/state-management.tex b/chapters/basics/state-management.tex new file mode 100644 index 0000000..24910da --- /dev/null +++ b/chapters/basics/state-management.tex @@ -0,0 +1,45 @@ +\pagebreak +\section{Zustandsverwaltung} + +Nachdem nun die Grundlagen des Flutter-Frameworks und die Details der Zustandsverwaltung der Widgets im letzten Kapitel erläutert wurden, kann jetzt betrachtet werden, was überhaupt die Zustandsverwaltung umfasst. + +\citeauthor{flutterinaction} fasst den Komplex der Zustandsverwaltung in Flutter in seinem Standardwerk \textit{\citetitle{flutterinaction}} wie folgt zusammen: + +\begin{displayquote}[{\cite[Kap.8.1.2]{flutterinaction}}] + State management is a combination of passing data around the app, but also re-rendering pieces of your app at the right time. All the re-rendering in Flutter is dependent on the State object and its lifecycle. +\end{displayquote} + +Daraus ergibt sich, dass die State-Klasse in der Zustandsverwaltung von Flutter eine wichtige Rolle spielt, und alle Ansätze dieses Konzept benutzen müssen, um in das Flutter-Framework integrierbar zu sein. \citeauthor{flutterinaction} beschreibt dabei die Aufgabe der Zustandsverwaltung eher auf einer Ebene des Datenflusses und des Ablaufs der Neu-Erstellung der Benutzeroberfläche. + +\citeauthor{managingstateinflutter} sieht die Zustandsverwaltung dabei eher auf einer eher ablaufszentrierten Sichtweise indem er die Aufgabe der Zustandsverwaltung wie folgt analysiert: + +\begin{displayquote}[{\cite[Kap.1]{managingstateinflutter}}] + State management is simply a technique, or multiple techniques, used to take care of the changes that occur in your application. +\end{displayquote} + +Als Beispiele nennt er dabei, das Reagieren auf Interaktionen mit der Anwendung oder die Beibehaltung des Datenflusses über mehrere Screens hinweg. + +Beide Sichtweisen haben gemein, dass die Grundaufgabe der Zustandsverwaltung die Sicherstellung eines korrekten Zustands der Anwendung, einzelner Screens oder einzelner Widgets sein muss, sowie die mögliche Überführung dieses Zustands in einen neuen Zustand als Reaktion auf Veränderungen. + +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} + +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} + +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. + +\begin{wrapfigure}{l}{0.33\textwidth} + \centering + \includegraphics[width=0.98\linewidth]{chapters/basics/setState_tree.png} + \caption{Flutter Widget Tree bei setState} + \label{fig:flutterTreeSetState} +\end{wrapfigure} + +Wie vorausgehend beschrieben, muss ein Zustandsverwaltungssystem aber nicht nur den Zustand einzelner Widgets verwalten können, sondern auch von größeren Ordnungen wie beispielsweise von Screens oder der ganzen Anwendung. Um dies bei diesem Ansatz erreichen zu können, wir der Zustand oder Teile des Zustands über die Konstruktor innerhalb des Widget-Trees weiter nach unten gegeben. + +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} \ No newline at end of file