Flutter App Development - Teil 4.2 - Main und RSS-Feed-Logik

Aufgrund der Länge des Beitrags habe ich diesen Abschnitt des Tutorials noch einmal aufgeteilt. Die erste Hälfte (Main Logik) findet ihr hier.
Nachdem wir nun die App initial laden können, geht es weiter mit der Liste der RSS Feeds. Dieser Bereich besteht bei mir aus fünf Dateien. Im feed_list Package open_in_new befinden sich die feed_list.dart open_in_new, feed_list_barrel.dart open_in_new, feed_list_bloc.dart open_in_new, feed_list_change.dart open_in_new und feed_list_events_states.dart open_in_new. Der Aufbau ist sehr ähnlich unserem Main Konstrukt, mit einer weiteren Datei, welche das Hinzufügen, Bearbeiten und Löschen über die UI ermöglicht. Die Event / State Datei (lib/feed_list/feed_list_events_states.dart open_in_new) und die Barrel Datei (lib/feed_list/feed_list_barrel.dart open_in_new) wird im Folgenden nicht weiter erläutert, da sie trivial sind.
Beginnen werden wir nun mit dem FeedListBloc. Dieser könnte als Herzstück der App bezeichnet werden, da er sowohl die RSS Feeds verwaltet, wie auch Updates aller Feeds durchführen kann. Die gesamte App arbeitet dabei mit nur einem FeedListBloc, welcher bereits in der lib/main.dart open_in_new erstellt und mittels eines Providers darunterliegenden Strukturen zur Verfügung gestellt wird. Damit kann sichergestellt werden, dass keine unnötigen Objekte erzeugt werden oder aber falsche States aktualisiert werden.
Flutter App Development - Teil 4.1 - Main und RSS-Feed-Logik

Nun geht es in die vollen, denn heute bauen wir unsere erste richtige Logik. Am Ende des vierten Teils dieser Tutorialreihe soll die initiale Logik zum Start der App und die RSS Feed Logik implementiert sein.
Zur Umsetzung erstellen wir den MainBloc (lib/main/main_bloc.dart open_in_new), der die Datenbank lädt und später z.B. das Laden der Konfiguration übernehmen kann. Sobald dieser Vorgang abgeschlossen ist, sollen alle RssFeed Objekte mit Hilfe des FeedListBloc (lib/feed_list/feed_list_bloc.dart open_in_new) aus der Datenbank geladen werden.
Damit die Datenbank auch mit Inhalt gefüllt ist, soll es über die UI möglich sein einen neuen Feed anzulegen. Sowohl für das Laden der RssFeeds, wie auch für das Hinzufügen wird der FeedListBloc genutzt. Außerdem erstellen wir geeignete Widgets zur Darstellung der Liste (lib/feed_list/feed_list.dart open_in_new) und des Formulars (lib/feed_list/feed_list_change.dart open_in_new), wobei letzteres im nächsten Teil der Reihe umgesetzt wird.
In diesem Zuge habe ich auch eine kleine Umbenennung vorgenommen, denn unser RssList Widget (nun FeedList Widget) und alle damit verwandten Klassen, befinden sich nun im FeedList Kontext open_in_new (Namen und Pakete). Dieser Name gefiel mir einfach besser und ist gleichzeitig kürzer und deutlicher. Die Bezeichnung für den Typ bleibt allerdings unverändert bei RssFeed.
Damit das Verstehen der folgenden Schritte leichter fällt, beginne ich mit einem schnellen Einblick in das BloC Konzept. Ich empfehle euch allerdings die offizielle Dokumentation open_in_new zum Thema anzuschauen, wenn ihr das Ganze aktiv nutzen wollt. Sie ist übersichtlich, gut gemacht und bietet außerdem diverse gute Beispiele.
BloC oder auch Business Logic Components ist mein aktuell favorisierter Weg, um Logik von UI und wiederum von Daten zu trennen. Dafür wird sehr intensiv auf das Konzept von Streams open_in_new gesetzt. Ein BloC interagiert immer mit zwei Streams, einem für den Input (Events) und einen für den Output (States), dabei sollte jedes Event zu mindestens einem passenden State führen. Im konkreten Library Kontext wird dafür die mapEventToState() open_in_new Methode genutzt. Sofern ihr einen BloC erstellt und Bloc open_in_new erweitert, müsst ihr sowohl die akzeptierten Events dieses BloC, wie auch die dazugehörigen States angeben. Diese definiert man meist in einer gesonderten Datei, wodurch ein übersichtlicher klarer Rahmen von erlaubten Eingaben und Ausgaben definiert wird.
Events können von der UI, z.B. durch einen Tap auf einen Button, kommen oder aber von anderen BloCs, bzw. tieferliegenden Komponenten. States werden vom BloC erzeugt und meist von der UI verarbeitet und führen zu automatischen Anpassungen von selbiger. Allerdings können auch andere BloCs auf State Änderungen hören und entsprechend Aktionen durchführen. Es ist außerdem erlaubt im Laufe der Verarbeitung mehrere States zu liefern. So macht es bei längeren Aktionen zum Beispiel Sinn, am Anfang einen Loading State zu übergeben und nach Abschluss einen State der die finalen Daten zurückgibt.
Entsprechend gibt es verschiedene Quellen für Events und verschiedene Ziele für States, auch mehrere gleichzeitig sind möglich. Streams bieten hier viele Freiheiten und Flexibilität, es ist allerdings extrem wichtig alles ordentlich zu dokumentieren und klare Flows zu etablieren. Denn mit großer Flexibilität kommt sonst großes Chaos.
Games Gewinnspiel April und Mai

Da ich im April sehr viel im Arbeitsumfeld zu tun hatte, musste der Blog leider etwas zurückstecken und unter anderem ging mein monatliches Gaming Gewinnspiel dabei unter. Aus diesem Grund ist die Mai Ausgabe mit der doppelten Menge an Preisen unterwegs. Soll heißen ich verteile dieses Mal bis zu 10 verschiedene Spiele an euch.
Zusätzlich wurde die Liste der verfügbaren Preise aktualisiert und es befinden sich nun wieder über 200 Spiele in der Preisliste. Aus diesen könnt ihr wie gewohnt wählen und mit etwas Glück und einem Kommentar unter dieser News gibt’s bald etwas Neues zu zocken für euch.
Abseits von diesem Gewinnspiel gibt es auch in der näheren Zukunft noch etwas Feines für euch, schaut also ruhig häufiger rein in der nächsten Zeit, es könnte sich lohnen. Alle Informationen zum aktuellen Gewinnspiel gibt es wie gewohnt im unteren Teil der News.
Flutter Static Analysis mit dem Pedantic Package

Beim Programmieren ist es wichtig bestimmte Regeln einzuhalten, dabei geht es nicht nur darum das der Code kompiliert, sondern auch das er verständlich, übersichtlich und dadurch wartbar ist und auch bleibt. Diese Dinge erzielt man meist indem man sich an bestimmte Guidelines hält. Diese gibt es oft von den Entwicklern der Sprache selbst, von großen Organisationen oder aus anderen Quellen. Woran man sich konkret hält ist zwar Geschmackssache, aber man sollte auf jeden Fall einen konsistenten Pfad verfolgen.
Da wir aber alle nur Menschen sind, dadurch Dinge vergessen oder einfach übersehen, ist eine technische Hilfe durchaus willkommen. Lint Checker open_in_new helfen uns mit Warnings und teilweise bietet die dazu passende IDE sogar Autokorrekturfunktionen an. Im Flutter Kontext habe ich zuletzt die genannten Dinge kombiniert.
Ich habe mir das Pedantic Package open_in_new geschnappt, welches die Lint Regeln von Googles Dart / Flutter Entwicklern beinhaltet, selbige mit meinen privaten Projekten in Android Studio verknüpft und somit mit extrem wenig Aufwand, noch einmal diverse kleine Baustellen aus der Welt geschafft.
Das Package selbst wird wie gewohnt als Dependency eingebunden, meinem Fall aber im dev
Bereich der pubspec.yaml Datei, da ich nur die Checks während der Entwicklung nutzen möchte.
dev_dependencies:
pedantic: ^1.8.0
Neben eurer pubspec.yaml benötigt ihr eine weitere Datei. Falls noch nicht vorhanden erstellt die analysis_options.yaml im Root Verzeichnis eures Projektes und fügt die folgende Zeile ein.
include: package:pedantic/analysis_options.yaml
Ich führte anschließend noch einmal ein flutter pub get
aus und schon flogen mir die Warnings nur so um die Ohren. So schlimm war es nicht, aber den einen oder anderen Tipp gab es dann doch noch für mich. Tatsächlich alle nachvollziehbar und mit wenigen Klicks via Android Studio Quick Fix behoben. Meiner Meinung nach ein einfacher Weg, um die Codequalität eines Projektes weiter zu heben. Alternativ gibt’s übrigens auch noch das Effective Dart Package open_in_new , welches direkt alle Regeln des Effective Dart Guides anwenden soll. Selbiges werde ich in der Zukunft auch noch ausprobieren.
Humble Square Enix Collective Bundle 2020

Humble und Square Enix haben sich zusammen getan und bieten noch ziemlich genau fünf Tage lang das Humble Square Enix Collective Bundle 2020 an. Für einen Euro gibt’s bereits Oh My Godheads, Goetia, OCTAHEDRON und Deadbeat Heroes für euch.
Der Durchschnitt möchte überboten werden, was ihr aktuell mit ca. sieben Euro erreicht und schon dürft ihr euch zusätzlich über The Turing Test, Forgotton Anne, Fear Effect Sedna und Black The Fall freuen. Die letzte Stufe ist dann nicht mehr weit, denn für neun Euro ist sie bereits zu haben. Hier gibt es Children of Zodiarcs, Boundless, Tokyo Dark und BATTALION 1944 für eure Spielebibliothek.
Wie immer geht ein Teil der Einnahmen dieses Bundles an einen guten Zweck. Alle Humble Bundle Links sind Affiliate- / Partner-Links die meinen Blog unterstützen.
Flutter App Development - Teil 3 - Typen und die Datenbank

Nach dem der letzte Teil ein sehr langes Intro war, erstellen wir nun die Typen und die Datenbank, inklusive Wrapper-Objekten, welche uns die einfache Nutzung der Datenbankinhalte innerhalb der BloCs erlauben sollen. Neben einer sehr kleinen Basisklasse (lib/types/database_entry.dart open_in_new) für die Typen, gibt es zwei Haupttypen. Einmal den RssFeed (lib/types/rss_feed.dart open_in_new) und den RssEntry (lib/types/rss_entry.dart open_in_new). Diese beiden bilden die initiale Datenbasis, mit welcher ich arbeiten möchte. Im folgenden findet ihr Code-Teile der genannten Klassen und einige Erklärungen dazu.
lib/types/database_entry.dart
(Code auf GitHub open_in_new)
abstract class DatabaseEntry {
Map<String, dynamic> toMap();
int get id;
}
Diese kleine Basisklasse zwingt unsere Typen dazu, sowohl ein Mapping Funktion zur Verfügung zu stellen, wie auch einen Getter für die Id. Die Mapping Funktion ist relevant, da unsere Datenbank JSON open_in_new als internes Format nutzt und entsprechend gerne mit Key-Value-Maps arbeitet. Ich hätte hier gerne noch Wrapper-Funktionen für die Erstellung der jeweiligen Objekte hinzugefügt, aber dafür wäre Generic-Black-Magic nötig gewesen, welche den Umfang dieses Tutorials sprengen würde.
Rainbow Six Siege - Year 5 - 1.2 Patch erschienen

Es ist bereits ca. eine Woche her, aber meiner Meinung nach trotzdem eine Erwähnung wert, denn es gab mal wieder ein Rainbow Six Siege Update. Der Year 5 - 1.2 Patch behebt Probleme bei der Zerstörung von Barrikaden und der Synchronisation dieser Daten zwischen allen Spielern. Außerdem wurden UI Probleme, ein Clipping-Fehler und Startschwierigkeiten bei der neuen Vulkan Version des Spiels behoben. Auch das Licht auf der Map Consulate sollte nun wieder normal sein.
Im Balancing-Bereich hat sich ebenfalls einiges getan, wobei man allem voran wohl erwähnen sollte das Jäger nun ein 2 / 2 Operator ist. Entsprechend hat er nun etwas mehr Rüstung, spielt sich aber auch langsamer, was dem einen oder anderem sauer aufstoßen dürfte.
Buck verliert seine Granaten und bekommt dafür eine Claymore und mehr Munition für sein Gadget. Goyo verliert ein Schild und Mozzie verliert seine Super Shorty Secondary. Ying darf sich über mehr Candelas freuen und erhält interessanterweise eine Rauchgranate statt einer Claymore, ebenso wie etwas mehr Schaden für die T-95 LSW. Die TCSG12 (Kaid, Goyo) erhält zwar ein zusätzliches Magazin, verliert dafür aber gravierend an Schaden (57 statt 84).
Man sieht hier wurde mal wieder ordentlich an den Stellschrauben gedreht und vor allem die Änderung an Ying gibt mir durchaus Fragezeichen auf, aber warten wir ab wie sich die Operator entwickeln. Generell muss man ja auch sagen das im normalen Casual und Ranked Bereich, diese Änderungen meist ohnehin nicht sonderlich tiefgehende Folgen haben.
Escape from Tarkov - Update 0.12.5 erschienen

Am gestrigen Montag erschien eine neue Escape from Tarkov Version. Das Update auf 0.12.5 wird das letzte vor dem nächste Wipe bzw. Reset sein und bringt diverse Bug Fixes mit sich. Vor allem im UI Bereich und bei der Navigation durch Menüs wurde dabei einiges verbessert. Doch auch unsichtbare Granaten sollen nun der Vergangenheit angehören.
Verbessert wurden diverse tieferliegende Systeme innerhalb des Spiels, wodurch kurze Lags bzw. das Einfrieren des Spiels weiter minimiert werden soll. Außerdem soll die Nutzung von verschiedenen Visieren nun weniger Performance-Hungrig sein.
Neu hinzugekommen ist ein Service von Therapist. Dieser erlaubt es dem Spieler direkt nach dem Raid zu sehen wo er getroffen wurde und welche Verletzungen vorliegen. Dies können dann, gegen ein entsprechendes Entgelt, direkt geheilt werden, sodass der Charakter direkt wieder fit für eine neue Runde ist. Zusätzlich wurden weitere Menüpunkte in das untere Hauptmenü eingefügt, sodass die Navigation innerhalb des Spiels schneller von statten gehen sollte.
Abschließend wurden verschiedene Filter im Spiel hinzugefügt. Diese sogenannten PostFX Filter erlauben es Farbwerte, die Helligkeit und diverse andere Dinge zu kontrollieren. Zuvor nutzen viele Spieler externe Tools für derartige Einstellungen, was von nun an aber durch die internen Tools geregelt werden soll. So wird z.B. NVIDIA ab dem 1. Mai ihr Filter-Tool für EFT abschalten.
Ein schöner Patch wie ich finde und ich bin schon gespannt wann der Wipe nun konkret stattfinden wird. Derzeit wird von Mai – Juni ausgegangen.
Flutter App Development - Teil 2 - Libraries und Architektur

Womit geht es in Teil zwei weiter habe ich mich gefragt. Sowohl die UI, wie auch die eigentliche Architektur könnten ein Thema sein. Ich persönlich bevorzuge erst die Logik, dann die UI und entsprechend machen wir heute auch weiter. Bevor wir jetzt aber alles selber schreiben, binden wir erst einmal relevante Libraries ein. Denn es gibt ein paar Dinge die man nicht unbedingt selber schreiben möchte.
pubspec.yaml
(Code auf GitHub open_in_new)
name: fss
description: Fluttery Site Summaries - RSS the Flutter way
version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
bloc: ^4.0.0
flutter_bloc: ^4.0.0
flutter_html: ^0.11.1
http: ^0.12.0+4
intl: ^0.16.1
path_provider: ^1.6.7
sembast: ^2.4.2
url_launcher: ^5.4.5
webfeed: ^0.4.2
dev_dependencies:
flutter_test:
sdk: flutter
pedantic: ^1.9.0
flutter:
uses-material-design: true
Humble Book Bundle - Artificial Intelligence & Machine Learning

Solltet ihr in der aktuellen Zeit gerne etwas Neues lernen wollen, schaut euch doch mal das Humble Book Bundle: Artificial Intelligence & Machine Learning by Morgan & Claypool an. Hier gibt es diverse Bücher, zu zwei der interessantesten Tech-Themen der aktuellen Zeit.
Für einen Euro gibt es drei Bücher, ab 7,50 Euro kommen noch einmal sechs hinzu und die finale Stufe, welche 13,50 Euro kostet, erweitert das Bundle noch einmal um zehn Bücher. Insgesamt könnt ihr also für unter 15 Euro fast 20 Bücher bekommen. Unter anderem erhaltet ihr Human Computation, Data Management in Machine Learning Systems und Creating Autonomous Vehicle Systems.
Ein breites Spektrum der genannten Themenbereiche AI und Machine Learning wird hier abgedeckt und sofern euch das Ganze interessiert, könnt ihr ja mal einen Blick drauf werfen. Ich persönlich bin aktuell leider mit Arbeit und privaten Projekten gut beladen, sodass für derartige Ausflüge zurzeit wenig Spielraum zur Verfügung steht. Alle Humble Bundle Links sind Affiliate- / Partner-Links die meinen Blog unterstützen.