Manche Aufgaben dauern, etwa das Lesen einer Datei. Ein Future ist ein Versprechen auf ein späteres Ergebnis oder einen Fehler. async erlaubt await in einer Funktion. await wartet auf das Ergebnis dieser Aufgabe, ohne daraus automatisch eine neue parallele CPU-Arbeit zu machen. Fehlende Werte und fehlgeschlagene Aufgaben sind zwei verschiedene Fälle.
01Ein Ergebnis später liefern
loadName liefert Future<String?>. Das Ergebnis darf Text oder null sein. Future.delayed simuliert eine Wartezeit. In einer echten App könnte stattdessen eine Datei oder Datenbank gelesen werden.
Future<String?> loadName() async {
await Future<void>.delayed(const Duration(milliseconds: 100));
return null;
}
Future<void> main() async {
try {
final name = await loadName();
print(name ?? 'No vehicle yet');
} catch (error) {
print('Loading failed: $error');
}
}
Starten / prüfen
dart run async.dart02await und ?? verwenden
await loadName() liefert den späteren Wert. ?? behandelt anschließend nur null. Eine geworfene Exception überspringt dagegen die normale Ergebnisverarbeitung und erreicht catch.
03Fehler sichtbar behandeln
Ändere loadName probeweise zu throw StateError("Cannot load"). Die Fehlermeldung zeigt den anderen Weg. In einer Oberfläche unterscheiden wir später Laden, Erfolg, leere Daten und Fehler. Ein leerer Name darf nicht still als erfolgreicher Ladevorgang mit erfundenen Daten erscheinen.
Nach kurzer Wartezeit: No vehicle yet
Deine Übung
Liefere Family car statt null. Entferne danach await und beobachte den Typ des Ergebnisses.
Lösung mit Erklärung anzeigen
Mit await erhältst du String?. Ohne await erhältst du Future<String?>. Das ist die noch nicht abgeschlossene Aufgabe und nicht der fertige Name. Setze await wieder ein, bevor du den Namen weiterverarbeitest.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.