Flutter -- Async Await Part 1

Als Quelle für diesen Artikel dienten die offizielle Dartdokumentation und ein YouTube Video von Rapido.

Der "normal" Ablauf in einem Programm ist synchron. Damit ist gemeint, das eine Programmanweisung nach der anderen abgearbeitet wird. Die nächste Programmanweisung kann erst dann ausgeführt werden, wenn die aktuelle beendet ist.
Manche Programmanweisung können aber durchaus spürbar Zeit in Anspruch nehmen, bevor sie abgeschlossen sind. Hier kann ich manchen Fällen, nicht in allen, das asynchrone Strukturieren der Applikation eine Lösung sein. In Dart, und damit in Flutter, repräsentieren sogenannte Future Objekte, das Resultat solchen asynchronen Programmcodes.

Hier ein kleines Beispiel, das die Problematik verdeutlicht:

String vorname;
String nachname;
String ganzername;
vorname = holeVorNameAusWeb();
nachname = holeNachNameAusWeb();
ganzername = "${vorname} ${nachname}";
print("$ganzername");

Der Aufruf der Funktion holeVorNameAusWeb(), kann das ganze Programm anhalten. Es kann ja dauern, bis wir die gewünschte Information aus dem Web verarbeiten können.

Was passiert beim asynchronen Ablauf genau ?


Wenn Code als asynchron programmiert wird entsteht ein Future Objekt<T> . Dieses repräsentiert eine asynchrone Operation, die als Resultat ein Objekt T zurückgibt. Sollte das zurückgegebene Objekt keinen brauchbaren Wert enthalten, ist es vom Typ Future<void> .

Wenn eine asynchrone Operation gestartet wird:
  1. die Funktion beginnt ihre Arbeit und gibt ein unvollständiges Future Objekt zurück
  2. später, wenn die Funktion abgearbeitet ist, wird das Future Objekt mit einem Wert (im Erfolgsfall) oder mit einem Fehler komplettiert.
Im Umgang mit asynchronen Operationen haben wir drei wichtige Begriffe: async, await und die Future API. Während die Future API vollen Zugriff auf die Möglichkeiten von Dart im Zusammenhang mit asynchronem Programmieren bietet, sind async und await für einfachere Einsätze bestens geeignet.
Eine typische async Funktion hat das Schlüsselwort vor seinem Funktionskörper und setzt await innerhalb dieses Körpers ein. Aber fangen wir mit einem konkreten (aber nicht lauffähigem) Beispiel an:

Dieser Code gibt natürlich Fehlermeldungen in der IDE aus, da eine Funktion nicht definiert ist. Der Code zeigt aber die Problemstellung auf. Mit der Funktion textVomServer() wollen wir eine Zeichenkette holen, welche anschließend im Center Widget ausgegeben werden soll.  Die Lösung folgt im nächsten Post..den findet man hier!

Kommentare

Beliebte Posts aus diesem Blog

Material Design in Flutter Teil 2

Flutter -- ohne Dart geht es nicht 2 -- einfache Variablen Typen

Dart Final Const