Posts

Es werden Posts vom April, 2019 angezeigt.

Dart openRead

Bild
Im letzten Post haben wir uns angesehen, wie man ganze Zeichenketten aus einem File liest und schreibt. In diesem Post geht es um eine flexiblere Methode, welche uns der Einsatz von Streams zur Verfügung stellt. Insbesondere die Möglichkeit ganz genau festzulegen, wie viel man aus der Datei auslesen möchte und ab welcher Stelle, macht openRead interessant. openRead Hier ein nur minimal abgeändertes Beispiel aus der original Dokumentation: Als erstes fällt .transform auf.  Wir haben zu Beginn einen Stream geöffnet und lesen Daten aus dem File ein. Man kann sich diese eintreffenden Daten als einen Strom vorstellen, auf welchen mit .transform eine Manipulation vorgenommen wird. Die erste Veränderung an den Daten erfolgt über über den utf8.decoder . Er wandelt die eintreffenden Daten in Zeichen (Strings) um. Das nächste .transform implementiert den LineSplitter() . Diese Funktion unterteilt den Datenstrom, der durch den utf8.decoder zu einem String Strom wurde, in

Dart File readAsString writeAsString

Bild
Natürlich kann man mit der Programmiersprache Dart auch Files lesen und schreiben. Um das zu bewerkstelligen importieren wir die d art:io Library, sprich die Bibliothek, die uns die entsprechenden Klassen und Methoden / Funktionen zur Verfügung stellt File readAsString Beispiel Code : Eine Funktion die eine Datei komplett als Zeichenkette ausliest. Was gleichzeitig bedeutet, das sie sich nur für kleine Dateien bzw Anwendungsfälle mit kurzen Zeichenketten eignet. Das erste was auffällt, ist die asynchrone Implementierung. Der Rückgabewert ist ein  Future Objekt vom Typ String . Mit new File(...) wird ein neues File Objekt erzeugt, wobei man dieser Funktion den Filenamen als String übergibt. Die Funktion geht davon aus, das sich dieses File auf der obersten Ebene des Projekt Ordners befindet. Natürlich ist auch ein anderer Pfad möglich, dazu aber mehr in einem anderen Post. Die eigentliche Arbeit geschieht mit readAsString() . Der Funktion kann noch mitgegebe

Dart Final Const

Bild
Der Einsatz von  Final und Const in Dart ist nicht ganz einfach zu verstehen. Beide Schlüsselwörter deklarieren eine Variable, die explizit im Code initialisiert werden muss und im weiteren Verlauf nicht mehr veränderbar ist. Wir können zum Beispiel  deklarieren:  int zahl ; . Die Variable zahl ist nicht initialisiert und wird von Dart mit dem Wert  null belegt. Das sollte man nicht mit 0 verwechseln. null lässt sich am besten mit " undefiniert " übersetzen und ist ein Sprachkonstrukt, welches sich innerhalb von Dart auch benutzen bzw abfragen lässt. Im weiteren Verlauf des Programms können wir der Variable zahl werte zuweisen, sprich den Inhalt von zahl ändern. Bei final und const sieht das anders aus. const Beispiel Code: Die erste Variable wird const int tage deklariert. Jeder Versuch sie im weiteren Programmverlauf zu ändern, wird eine Fehlermeldung hervorrufen. Die zweite Variable entsteht aus einer Berechnung, wobei die erste mit einbezogen

Dart Assert

Bild
Die Suche nach einem Fehler im eigenen Code, ist etwas das jedem Programmierer bekannt sein dürfte. Um das zu vereinfachen gibt es verschiedene Ansätze und Möglichkeiten. In diesem Post gehen wir auf assert ein. Die assert() Funktion wertet aus, ob ein Ausdruck, wahr oder Falsch ist. Ist er wahr, wird das Programm fortgesetzt. Ist er falsch, wird eine Fehlermeldung generiert. Beispiel 1: In diesem Beispiel werden zwei Integer Variablen verglichen. Das Resultat ist natürlich " falsch ". Dart assert - für was ? assert generiert Ausnahme Die IDE und der Compiler weisen uns auf eine Reihe von  Fehlern hin. Ein fehlendes Argument in einer Funktion, eine falsche Verwendung von Variablen Typen und vieles mehr. Diese Fehlerkontrolle läuft aber ins Leere, wenn der Code selbst fehlerfrei ist, die Logik dahinter aber nicht. Wenn wir vom Code erwarten, das er an einem bestimmten Punkt, ein definiertes Ergebnis liefert, sprich zum Beispiel einen Wert oder eine wahr

Dart Async Await

Bild
Von Futures in Dart ist es nicht weit zu async und await . Mit diesen zwei Schlüsselwörtern stellt die Programmiersprache Dart, weitere Werkzeuge zur Verfügung, die asynchrones Programmieren ermöglichen. Wie wir im letzten Post gesehen haben, gibt uns Dart mit dem Objekttyp Future eine Möglichkeit in die Hand. async und await ergänzen die Palette. Schauen wir uns aber den Code nochmal an: Mit .readAsString() gibt uns die Funktion Daten zurück, vom Typ Future . Diese können wir dann bequem mit .then weiterverarbeiten. In einem weiteren Beispiel haben wir gesehen, das wir auch eigene Funktionen vom Typ Future programmieren können. Kommen wir nun zu async await Diese beiden treten immer zusammen auf. await macht nur in einem asynchronem Zusammenhang Sinn. Eine Funktion die mit async gekennzeichnet ist, retourniert immer ein Future! Nehmen wir also den Code aus dem letzten Post und passen ihn mit async und await an: Wir haben jetzt den ganzen ganzen main (...)

Dart Future

Bild
In diesem Blog habe ich das Thema Future schon einmal gestreift. Das ist aber schon eine Weile her. Zeit, es noch einmal zu tun. Führen wir uns als erstes noch einmal vor Augen, was ein Future genau ist. Future Nehmen wir an wir wollen ein File von der Festplatte laden. Das kann ein kleines File sein, was schnell geht, oder ein großes. Beim großen File kann das dauern, bis wir mit dem File weiter arbeiten können. Oder wir greifen auf das Web zu und laden von dort Daten. Je nach Internetverbindung, nach gösse der Daten, dauert auch dies unterschiedlich lang. In beiden Fällen müssen wir also warten, bis wir das File oder die Daten aus dem Internet geladen haben. Dieses Schaubild verdeutlicht die Problematik sehr gut. Der schwarze Balken repräsentiert unseren Programm Ablauf, von Oben nach unten . Im asynchronen Ablauf wartet die Software die Antwort ab, in unserem Fall bis zum Beispiel das File geladen ist. Im asynchronen Ablauf, wird direkt nach dem "auslösen"

GitHuB Tip

Bild
Versionskontrolle ist nicht nur für Profis ein gutes Werkzeug. Auch der Amateur kann davon profitieren. Dabei ist es nicht einmal die Versionskontrolle an sich, die für einen Anfänger am interessantesten ist, sondern die Möglichkeit, ganz einfach ein Projekt in den Editor zu laden Aktuell haben viele Tutorials ihren Quellcode auf Github , was das mühsame abtippen von früher überflüssig macht. Anzuraten ist, sich einen Account auf GitHub zu erstellen. Klonen Die einfachste Möglichkeit, finde ich jedenfalls, ist ein Repository zu klonen. GitHub hat diese Möglichkeit ja auch schon fest in seiner Website verankert. Man kann sich dort, den notwendigen Link in die Zwischenablage kopieren und dann im Editor, im meinem Fall Visual Studio Code, verwenden.  Dazu muss man, wie meistens bei GitHub, das Terminal verwenden. Dabei sollte man sich in dem Ordner befinden, wo der Projektordner anschließend platziert sein sollte. Wenn nötige also das Directory wechseln. Bsp : git clone htt

Flutter Library: flutter_bloc

Bild
London Es wird Zeit für einen weiteren Versuch sich mit dem Begriff " BloC Pattern " zu befassen. Während wir im ersten Post zu diesem Thema, alles von Hang gemacht haben, kommt diesmal eine Flutter Library zum Einsatz. Sie soll im Vergleich die Handhabung von BloC vereinfachen. Zum testen setzen wir dabei das Counter Beispiel, das per Voreinstellung bei jedem neuen Flutter Projekt in Visual Studio generiert wird, als BloC Variante um. Das klingt an sich langweilig, aber es geht ja mehr um die Handhabung von BloC, als um das Ergebnis der App. Flutter BloC Pattern Zum auffrischen halten wir uns noch mal vor Augen, das das Ziel ist, die Präsentation der App von der Logik zu trennen. Theoretisch sollte im Code für die UI keine Bussineslogik stehen und im Logikteil der App, keine UI Elemente. Als Vorbereitung müssen wir die Flutter Bloc Library in unser Projekt einfügen. Man kann das von Hand machen, oder sich eine Extension holen, die das vereinfacht. Eine Möglich

Flutter BloC Pattern 1

Bild
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 B usiness Lo gic Co mponent 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 wi

Flutter -- ohne Dart geht es nicht Klassen Teil 3 Factory

Bild
Baum im Wasser Wer Flutter effektiv nutzen möchte, sollte sich mit objektorientierter Programmierung auskennen und damit mit dem Konzept von Klassen. Im letzten Post zum Thema Klassen haben wir den Konstruktor einer Klasse betrachtet. In diesem Post geht es um eine Variante davon, den Factory Konstruktor Eine Klasse, also ein Bauplan für ein Objekt, möchte man so flexibel wir möglich einsetzen können. Aber wieso überhaupt ? Flexibler Einsatz von Code bzw Programmteilen bedeutet in der Regel, auch eine geringere Programmgröße. Die Größe einer Software hat immer einen Zusammenhang mit dem Speicherverbrauch, ob das nun einen PC betrifft oder ein Smartphone. Starten wir mit einem Beispiel: Eine sehr einfache Klasse, mit einem Textfeld und einem Konstruktor, der nichts macht. Wenn wir dieses Beispiel nun ausbauen, könnten wir so vergehen, das wir entweder pro Superheld, denn wir verwenden möchten, eine neue Klasse erstellen oder diese einte Klasse so ausbauen, das mit Ihr ve

Flutter -- ohne Dart geht es nicht Klassen Teil 2

Bild
Im ersten Teil dieser kleinen Serie sind wir schon auf ein, zwei Punkte eingegangen, was Dart und Klassen betrifft. mehr zu einem Konstruktor Beim erstellen einer Klasse, dem "Bauplan" für ein Objekt in unserem Code, können wir einen Konstruktor implementieren. Vom Begriff Konstruktor , ist es nicht weit zu " konstruieren " und genau darum geht es. Wenn wir aus unserem Bauplan ein reales Objekt im Code machen, ist es zu Beginn nicht mehr, als ein Platz im Speicher. Mit dem Bauplan definieren wir aber auch Variablen / Felder des Objekts, wie zum Beispiel eine Zeichenkette: String zeichenKette1; Wir können diese Variablen schon im Bauplan mit einem Wert versehen, aber auch später, wenn wir das reale Objekt im Code generiert haben. Beispiel eins Wenn wir uns den Code oben ansehen, bemerken wir eine einfache Klasse mit zwei Feldern / Variablen. Weiter im Code eine Funktion mit dem gleichen Namen wie die Klasse , die zwei Variablen als Übergabew

Flutter -- ohne Dart geht es nicht Futures Async

Bild
Async - das unbekannte Wesen Im letzten Post haben wir mit dem Thema Futures begonnen. Zeit weiter zu machen ! Parallel oder gleichzeitig ? Wenn Dart ein Programm ausführt, geschieht das in einem Thread (Prozess). Der Code wird Zeile für Zeile abgearbeitet, bis das Programm endet. Wenn wir in unserem Code asynchrone Funktionen benutzen, wird dieser innerhalb dieses einten Prozesses ausgeführt. D.h. unser Code wird unterteilt und im Wechsel ausgeführt. Das Resultat ist praktisch eine gleichzeitige Abarbeitung von synchronem und asynchronem Code. Eine parallele Abarbeitung wäre eine gleichzeitige, aber unabhängige Abarbeitung des Codes. Das ganze Thema geht tiefer und steht im Zusammenhang mit Microtasks, Isolates und dem Event Queue .  Ich gehe hier nicht weiter darauf ein. Das würde den Rahmen dieses Posts sprengen. Ein einfacher Start Beginnen wir mit ein paar Zeilen Code: Drei Printfunktionen, die zweite mit einer Schleife, die eine Verzögerung in den Co

Flutter -- ohne Dart geht es nicht Futures

Bild
Futures Um mehr über Dart zu erfahren gehe ich in diesem Post auf das Thema Futures ein. Warum ? Das Konzept ist gerade auch für Flutter wichtig und ermöglicht eigentlich erst grössere Projekte. Was steckt also hinter Futures ? Nicht einfrieren In einem Programm kann es sein, das ein Resultat nicht sofort verfügbar ist. Wenn wir zum Beispiel ein File auslesen, oder auf die Antwort einer Website warten. Es gibt nun die Möglichkeit zu warten, bis das Resultat vorliegt. Das heißt, das Programm friert ein bis wir die Operation abschließen können. Oder wir wählen eine asynchrone Programmierung, d.h. auf der einten Seite warten wir auf den Abschluss einer Operation, während an anderer Stelle das Programm weiter läuft. Beginnen wir mit einem Beispiel. In Visual Studio Code erstellen wir ein Dart CLI Projekt, löschen aber den Boiler Code. Ein Beispiel In diesem Beispiel importieren wir dart:io und dart:async . In Visual Studio Code haben wir im Vorfeld ein file.txt an