Zum Hauptinhalt springen

FutureProvider

FutureProvider ist das Äquivalent zu Provider aus asynchronem Code.

FutureProvider wird üblicherweiße für folgendes verwendet:

  • Durchführung und Zwischenspeicherung asynchroner Vorgänge (z. B. Netzwerkanfragen)
  • nette Handhabung von Fehler-/Ladezuständen bei asynchronen Operationen
  • Kombination mehrerer asynchroner Werte zu einem anderen Wert.

FutureProvider in Kombination mit ref.watch wird sehr mächtig. Diese Kombination ermöglicht es, einige Daten automatisch neu zu holen, wenn sich einige Variablen ändern, um sicherzustellen, dass wir immer den aktuellsten Wert haben.

info

Der FutureProvider bietet keine Möglichkeit, die Berechnung nach einer Benutzerinteraktion direkt zu ändern. Er ist für die Lösung einfacher Anwendungsfälle konzipiert.
Für fortgeschrittenere Szenarien sollte StateNotifierProvider verwendet werden.

Anwendungsbeispiel: Lesen einer Konfigurationsdatei

FutureProvider kann ein bequemer Weg sein, um ein Konfigurationsobjekt, das durch das Lesen einer JSON-Datei erstellt wurde, zu veröffentlichen.

Die Erstellung der Konfiguration würde mit der typischen async/await Syntax, aber innerhalb des Providers. Unter Verwendung des Asset-Systems von Flutter würde dies wie folgt aussehen:



Future<Configuration> fetchConfiguration(FetchConfigurationRef ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;

return Configuration.fromJson(content);
}

Dann kann die UI auf die Konfigurationen wie folgt lauschen:


Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(fetchConfigurationProvider);

return switch (config) {
AsyncError(:final error) => Text('Error: $error'),
AsyncData(:final value) => Text(value.host),
_ => const CircularProgressIndicator(),
};
}

Dadurch wird die UI automatisch neu aufgebaut, wenn das Future abgeschlossen ist. Wenn mehrere Widgets die Konfigurationen benötigen, wird das Asset trotzdem nur einmal dekodiert.

Wie man sieht, gibt das Abhören eines FutureProvider innerhalb eines Widgets einen AsyncValue zurück, der die Behandlung des Fehler-/Ladezustands einfach ermöglicht.