Was ist flutter?

Flutter ist ein Open-Source-Software-Development-Kit (SDK) für die Entwicklung von Apps für mobile, Web und Desktop-Plattformen, die auf der Dart-Programmiersprache basieren. Es wurde von Google entwickelt und bietet eine schnelle und effiziente Möglichkeit, benutzerfreundliche Apps mit einer modernen und schnellen Benutzeroberfläche zu erstellen. Flutter nutzt die Dart-Programmiersprache. Flutter bietet eine umfassende Bibliothek an UI-Komponenten und Tools, die es Entwicklern ermöglichen, ihre Apps mit Animationen, Transitions, Shadow Effects, Cupertino- und Material-Design-Elementen anzureichern. Mit Flutter können Entwickler ihre Apps auch mit benutzerdefinierten Widgets erstellen, die aus einer Kombination von vordefinierten und selbst erstellten Komponenten bestehen. Durch den Einsatz moderner Technologien und seiner innovativen Architektur hat Flutter eine sehr hohe Leistung und eine sehr niedrige Latenzzeit. Es verwendet eine eigene Grafik-Engine, die es Entwicklern ermöglicht, native Geschwindigkeit und Animationen zu erreichen, ohne dass eine native Plattform-Komponente erforderlich ist. Insgesamt ist Flutter eine schnelle, leistungsstarke und flexible Plattform für die App-Entwicklung, die es Entwicklern ermöglicht, benutzerfreundliche, performante und ansprechende Apps für mehrere Plattformen zu erstellen.

Mit Flutter kann man native Apps für folgende Plattformen entwickeln: • iOS • Android • Windows • MacOS • Linux • Web (in Form von Progressive Web Apps) Dies bedeutet, dass man mit Flutter eine einzige Codebasis verwenden kann, um Apps für mehrere Plattformen zu entwickeln. Dies spart Zeit und erhöht die Effizienz im Vergleich zur Entwicklung von Apps für jede Plattform separat.

Widgets

Stateless Widgets


In Flutter sind StatelessWidget Widgets Komponenten, die keinen Zustand haben. Das bedeutet, dass sie sich nicht ändern und immer das gleiche Aussehen und Verhalten aufweisen, unabhängig von Benutzereingaben oder Systemereignissen.
StatelessWidget werden normalerweise verwendet, um Teile der Benutzeroberfläche darzustellen, die statisch sind und nicht auf Benutzerinteraktionen oder andere äußere Ereignisse reagieren müssen. Zum Beispiel könnte ein StatelessWidget eine Schaltfläche oder einen Textbereich darstellen.
Ein StatelessWidget wird erstellt, indem die Klasse StatelessWidget implementiert wird und die Methode build überschrieben wird. Die build-Methode gibt ein Widget-Objekt zurück, das die Benutzeroberfläche des StatelessWidget darstellt.
Im Vergleich zu StatefulWidgets sind StatelessWidgets einfacher zu verstehen und zu implementieren, da sie keine dynamische Verhaltensänderungen aufweisen. Außerdem sind sie schneller zu rendern, da ihr Zustand nicht geprüft werden muss.


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hello World',
      home: Scaffold(
        body: Center(
          child: Text('Hello, World!'),
        ),
      ),
    );
  }
}

Statefull Widgets

In Flutter sind StatefulWidgets Widgets, die einen Zustand haben, d.h. sie können sich ändern und reagieren auf Benutzereingaben oder andere Systemereignisse.
StatefulWidget werden normalerweise verwendet, um Teile der Benutzeroberfläche darzustellen, die dynamisch sind und auf Benutzerinteraktionen oder andere äußere Ereignisse reagieren müssen. Zum Beispiel könnte ein StatefulWidget ein Textfeld sein, das den Benutzertext anzeigt und aktualisiert, wenn der Benutzer Text eingibt.
Ein StatefulWidget wird in zwei Teilen implementiert: als StatefulWidget-Klasse und als Zustandsklasse. Die StatefulWidget-Klasse implementiert das äußere Aussehen und Verhalten des Widgets, während die Zustandsklasse den internen Zustand des Widgets verwaltet.
Wenn sich der Zustand eines StatefulWidget ändert, wird die Methode build der Zustandsklasse aufgerufen, um eine neue Darstellung des Widgets zu erstellen. Diese Methode gibt ein Widget-Objekt zurück, das die Benutzeroberfläche des StatefulWidget darstellt.
Im Vergleich zu StatelessWidgets sind StatefulWidgets komplexer zu verstehen und zu implementieren, da sie einen Zustand haben und auf Benutzereingaben oder andere Systemereignisse reagieren können. Sie können jedoch auch mehr Interaktivität und Dynamik in die Benutzeroberfläche einer App bringen.

Oracle APEX 19 Tutorial Teil 5 – Process and Condition

Dieser Teil des Oracle APEX Tutorials zeigt Ihnen, wie Sie Prozesse und Bedingungen ( Conditions ) in Ihren Anwendungen nutzen können.

Es ist ein wenig Zeit vergangen, seid dem ich den Teil 4 des APEX Einsteiger-Tutorials verfasst habe.  Die bisherigen Beschreibungen basierten noch auf der APEX Version 18.2. Diesem Artikel liegt nun die Version 19.1 zu Grunde, so dass Sie sich direkt mit dieser APEX Version vertraut machen können.

Noch einmal zur Erinnerung. Im letzten Artikel (Teil 4)  habe ich beschrieben, wie Sie für eine Tabelle eine Übersichtsseite und eine Form zum Erfassen und Bearbeiten des Tabelleninhaltes erstellen können.

Abbildung 34: APEX Form
Abbildung 34: APEX Form

Die Abbildung 34 zeigt Ihnen den Ausgangspunkt für dieses Tutorial. Für jede Spalten der Tabelle (NAMEN) wurde in der erstellen Form ein Feld – in APEX Item genannt – eingefügt. Je nach Spaltentyp wurden verschiedene Item-Typen verwendet.

Bei den letzten vier Items der Seite handelt es sich um Audit-Spalten in denen der Ersteller, das Erstellungsdatum sowie den letzten Änderer inkl. Änderungszeitpunkt erfasst werden sollen. 

Life-Cycle

Um zu verstehen, wie und wann ein sogenannter Process in einer APEX-Seite ausgeführt wird, ist es sinvoll sich zu vergegenwärtigen, wie eine Seite erzeugt wird.

Initial wird eine Seite durch einen Seitenaufruf per URL (http get) vom APEX-Web-Server angefordert. Der Web-Server reicht den Aufruf an die Datenbank weiter und führt dabei die PL/SQL Funktion f aus. Die Parameter, die der URL respektive dem http get request mitgegenen wurden, werden als Parameter an f  übergeben. In Abhängigkeit des aktuellen Session-Zustands, welcher im sogenannten Session-Cache gehalten wird, und den übergebenen Parametern, rendert f die neuen HTML-Seite. Diese wird dann als Antwort an den Client zurück geschickt. In anderen Szenarien erfolgt die Anfrage (Requests) mittels http-put, wobei sich der Ablauf aber ähnelt.

Im Rahmen dieses klassischen Anfrage- Antwortzyclusses ermöglicht es APEX Ihnen zu verschiedenen Zeitpunkten sogenannte Processes in der Datenbank auszuführen.

Prozess

Es gibt verschiedene Typen von Prozessen. Sie können z.B. vorgefertigte Prozesse verwenden, um Date aus einer Form in die Tabellen der Datenbank zu übertragen. Sie können eigene PL/SQL – Prozesse erstellen oder auch Web Services aufrufen, Mails versenden und vieles mehr.

Für dieses Beispiel sollen die Audit-Felder automatisch mit den entsprechenden Werten versehen werden.  

PL/SQL-Process erstellen

Eine oft genutzte Variante sind Prozesse, die Sie in PL/SQL erstellen können. Um so einen Prozess anzulegen gehen Sie wie folgt beschrieben vor.

Ausgehend von der Seite 3, welche in Abbildung 34 zu sehen ist, klicken Sie in der Developer Toolbar auf den Button “Edit Page”. 

Abbildung 35: APEX Create process
Abbildung 35: APEX Create process

Im Page Designer finden Sie, wie in Abbildung 35 zu sehen ist, die Möglichkeit einen neuen Prozess zu erstellen. Das geht z.B. über das Kontextmenü des Knotens process.

Geben Sie dem Prozess über seine Eigenschaften einen Namen (ID) und wählen sie als Typ PL/PQL-Code. Im Bereich source können Sie nun Ihren Quellcode unterbringen. 

In diesem Beispiel sollen das Item P3_CHANGED_BY und P3_CHANGED_ON mit einem Wert versehen werden.

Um auf ein Item zuzugreifen, stellen Sie dem Item-Namen einfach ein : voran. So können Sie z.B. über :P3_CHANGED_BY := :APP_USER;  den Namen des angemeldeten Users dem Item zuweisen. Abbildung 36 zeigt den kompletten Quellcode für dieses Beispiel.

Abbildung 36: PL/SQL Process
Abbildung 36: PL/SQL Process

Wie Sie dort sehen können, wird über sysdate noch der aktuelle Zeitpunkt einer Änderung ermittelt. Dieser wird allerdings als Char entsprechend formatiert dem Item zugewiesen. Achten Sie darauf, dass die Formatmaske hier mit der des Items übereinstimmt.

Abbildung 37: Formatmask
Abbildung 37: Formatmask

Anschließend bietet es sich noch an, die beiden Items in der Seite 3 auszublenden.

Abbildung 38: Hidden
Abbildung 38: Hidden

Das können Sie recht einfach bewerkstelligen. Markieren Sie dazu im Page Designer die beiden Items un d ändern Sie den Item-Typ auf Hidden (Ausgeblendet).

Wenn Sie nun über die Seite 3 einen neuen Eintrag erfassen oder einen vorhandenen Eintrag ändern, wird der Zeitpunkt der Änderung und der Name des Users vermerkt.

Conditions – Bedingte Prozesse

Wie Sie sicher bemerkt haben, wird der eben erstellte Prozess bei jeder Änderung in der Seite ausgeführt. Für das Speichern des Erstellzeitpunktes und des Erstellers eines neuen Datensatzes wurden der Seite und der Tabelle die beiden Items P3_CRETED_BY und P3_CREATED_ON zugefügt.

Um die Werte dieser beiden Items über einen weiteren Prozess zu setzten, können Sie wie im vorherigen Beispiel einen Prozess erstellen, der via. PL/SQL die Items setzte. Allerdings soll dieser Prozess nur einmalig ausgeführt werden, wenn ein neuer Datensatz angelegt wird. Für solche Fälle nutzen Sie in APEX sogenannte conditions.

Über eine condition können Sie beispielsweise prüfen, ob ein bestimmter Button gedrückt wurde. Sie können über diese Bedingungen feststellen, ob ein Item null ist oder einen definierten Wert besitzt. Für komplexere Prüfungen nutzen Sie einfach SQL oder PL/SQL.

Abbildung 39: Condition
Abbildung 39: Condition

Eine condition definieren Sie über die Eigenschaften eines Prozesses. Dort finden Sie unter conditions – in der deutschsprachigen Version “Serverseitige Bedingung” genannt – verschiedene Möglichkeiten. Für dieses Beispiel genügt es, den Prozess nur dann ausführen zu lassen, wenn der Button CREATE betätgt wird.