Flutter Version 1.20 erschienen
Gestern erschien eine neue Flutter Version und selbige bringt einige durchaus interessante Verbesserungen mit sich. Unter der Haube befindet sich nun Dart 2.9, wodurch unter anderem massive Verbesserungen beim UTF-8 Decoding gegeben sind. Diverse weitere Verbesserungen wurden ebenfalls in dieser neuen Dart Version vorgenommen, Null-Safety ist aber leider noch nicht verfügbar.
Im Performance Bereich können Animationen beim ersten Start der App nun flüssiger dargestellt werden, indem die Skia Shader Language Warm Up Funktion open_in_new genutzt wird. Die Größe eurer Apps wurde ebenfalls verringert, indem nicht genutzte Icons automatisch aus der App entfernt werden.
Für die Desktops wurde das Handling der Maus verbessert, sodass z.B. angepasste Cursor beim Hover über einem Textfeld integriert werden konnten. Auf den mobilen Plattformen wird nun Autofill unterstützt. Beide genannten Punkte waren sehr oft gewünschte Funktion und dürften bei der Community auf Anklang stoßen.
Sichtbare Änderungen sind vor allem die neuen und aktualisierten Widgets (InteractiveViewer, MaterialSlider, RangeSlider, TimePicker und DatePicker). Zusätzlich wurde der AboutDialog überarbeitet und ist nun responsive.
Für die Entwickler gibt es darüber hinaus noch Anpassungen im Bereich der pubspec.yaml Datei, vor allem wenn ihr Plugins entwickelt. Hier ist nun das neue Definitionsformat open_in_new. Es gibt außerdem eine Preview der neuen Dart DevTools in Visual Studio Code, verbessertes Network Tracking / Debugging, aktualisierte Importpfade beim Umbenennen von Dateien (Visual Studio Code) und viele weitere Änderungen.
Alle Änderungen, eventuelle Breaking Changes, sowie weiterführende Informationen könnt ihr den Related Links entnehmen. Dort findet ihr auch den Download. Wer bereits auf 1.20 ist sollte vielleicht noch ein weiteres Mal flutter upgrade
bemühen, denn mit Version 1.20.1 ist bereits ein Bugfix Update verfügbar.
pub.dev Website erhält Update
Wer Flutter Apps entwickelt wird die pub.dev Website für Packages sicherlich kennen. Hier findet ihr Flutter Pakete, erhaltet weitere Informationen und könnt mit wenigen Schritten selbige Pakete in eure Apps einbinden. Die Website ist quasi der Standard Anlaufpunkt, falls ihr Funktionalität aus externen Quellen einbauen wollt.
Entsprechend freut es mich sehr, dass die Seite selbst ein Update erhalten hat. Allem voran fällt das frische und übersichtliche neue Design auf. Es bietet etwas mehr visuell ansprechende Komponenten, büßt dabei aber keine Übersichtlichkeit ein.
Die Detailseiten bieten nun mehr Informationen zur Beliebtheit, der Popularität und anderen Faktoren. Das frische Design ist also nicht nur hübsch, sondern auch praktisch.
Die Hauptseite der Plattform bietet darüber hinaus nun Informationen zu aktuellen Favoriten der Community an und zeigt die populärsten Pakete. Dies ist sicherlich für den einen oder anderen interessant, der gerne etwas stöbert. Ich werde diese Funktion auf jeden Fall nutzen, um hin und wieder mal nach neuen Paketen Ausschau zu halten.
Auch wenn so ein Update vielleicht nur wie eine kleine Änderung wirkt, ich persönlich sehe es als sehr positives Zeichen, das nicht nur Dart / Flutter als Sprache und Framework wächst, sondern eben auch das Ökosystem drum herum gepflegt und aktualisiert wird.
It’s Flutter Day
It’s Flutter Day, mehr bräuchte ich eigentlich gar nicht zu schreiben. Etwas Kontext wäre aber vermutlich nicht schlecht, entsprechend nun ein paar weiterführende Worte. Der Flutter Day ist ein 24 Stunden Event mit 3 Livestream Sessions zum Thema Flutter und los geht’s heute um 18:00 Uhr unserer Zeit. Alles findet online statt, ist kostenlos und den Link zum Stream, sowie zur Anmeldung findet ihr in den Related Links.
Im Anschluss finden weitere Community Events und ein Hackathon statt, alles ebenfalls mit dem Thema Flutter. Sofern ihr also ins Thema eintauchen wollt oder euer Wissen mit anderen teilen wollt, schaut mal rein. Die Events sind nicht nur auf reine Vorträge ausgelegt, diverse Frage & Antwort Sessions gibt es ebenfalls. Den genauen Ablauf des Flutter Day findet ihr ebenfalls in den Related Links. Auch wenn die Zeiten für Europäer vielleicht etwas schlafraubend sind, sofern es passt und ihr euch für das Thema interessiert kann ich nur empfehlen mal einen Blick auf die Events zu werfen.
Der Einfachheit halber habe ich den Live Stream im unteren Teil der News auch direkt eingebettet, ihr könnt das Event also auch direkt hier schauen.
Flutter App Development - Teil 6 - RSS Entries und mehr
Heute geht es weiter mit den eigentlichen Einträgen eines RSS Feeds. Die dazugehörigen Dateien befinden sich im lib/entry_list/ open_in_new Package und sind verglichen mit der lib/feed_list/ open_in_new Logik etwas einfacher zu handhaben. Dieser Beitrag ist der Abschluss meiner kleinen Tutorialreihe und den gesamten Source-Code findet ihr auf Github. Links zu den gennannten Dingen findet ihr in den Related Links. Mit diesen kurzen Worten der Einleitung möchte ich heute direkt mit dem User Interface starten.
Flutter App Development - Teil 5 - RSS Feed Formular
Nachdem es durch die Neuinstallation des Servers und diverse andere Themen mal wieder ein paar Verzögerungen gab, geht es nun weiter mit meiner kleinen Futter Tutorialreihe. Heute gehe ich auf das Formular ein, welches das Hinzufügen und Bearbeiten von RSS Feeds erlaubt.
Ich werde heute lediglich eine Klasse beleuchten, da ich das Gefühl habe in anderen Beiträgen wurde etwas viel auf einmal erläutert. So hoffe ich etwas nachvollziehbarere Erklärungen liefern zu können. Wie gesagt ist auch für mich diese umfangreiche Tutorialreihe etwas Neues und zugleich ist sie sehr aufwendiges. Ich versuche entsprechend direkt während der Erstellung und wenn ich mir meine eigenen Beiträge später noch einmal anschaue, Dinge zu optimieren.
Doch nun zum eigentlichen Thema, dem Verwalten der RSS Feeds über ein Formular in Flutter, inklusive simpler Validierung der Eingaben und Übergabe der Daten an unseren BloC.
Flutter Version 1.17 erschienen
Vor ca. einer Woche erschien Version 1.17 des Flutter Frameworks. Googles Cross Platform Lösung erfreut sich bei mir weiterhin großer Beliebtheit, auch wenn man hier und da natürlich den einen oder anderen Stolperstein aus dem Weg räumen muss.
Unter anderem dafür sind ja bekanntlich auch neue Framework Versionen gedacht. Das letzte Update bringt allem voran massive Verbesserungen für die Performance unter Android und iOS. Wobei iOS durch den nun gegebenen Metal Support hier mit Abstand am meisten zulegt hat. Zusätzlich wurde teils extrem am Speicherverbrauch geschraubt. Wir reden hier von einer Beschleunigung um bis zu 35 Prozent, während für bestimmte Probleme bis zu 70 Prozent weniger Ram benötigt wird.
Dieser Release basiert auf Dart 2.8 open_in_new, bringt einige neue Material Widgets mit sich und behebt Probleme mit den Popupmenüs, welche bei einem Long-Press auf Text anzeigt werden. Die neue Version aktualisiert außerdem die gegebenen Text Styles, sodass selbige mit den aktuellen Material Design Guidelines Konform sind. Weitere Verbesserungen gab es im Bereich der Accessibility und Internationalization, zwei Bereiche die durchaus wichtig sind und wo es auf jeden Fall noch Verbesserungsbedarf gab.
Darüber hinaus hat das Google Font Package open_in_new die Version 1.0 erreicht und das neue Animations Package open_in_new soll euch mit vorgefertigten und häufig genutzten Animationen Arbeit abnehmen. Auch diverse Entwickler-Tools wurden aktualisiert oder optimiert und diverse weitere Kleinigkeiten angepasst.
Ich arbeite bereits seit einer Woche mit der neuen Version und konnte bis dato keine Probleme feststellen, sodass ich zum jetzigen Zeitpunkt durchaus meine Empfehlung zur Durchführung des Updates aussprechen kann.
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.
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.
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.