Aller au contenu principal

FutureProvider

FutureProvider est l'équivalent de Provider mais pour du code asynchrone.

FutureProvider est typiquement utilisé pour :

  • l'exécution et la mise en cache d'opérations asynchrones (telles que les requêtes réseau)
  • gérer correctement les états d'erreur/de chargement des opérations asynchrones
  • la combinaison de plusieurs valeurs asynchrones en une autre valeur

FutureProvider gagne considérablement à être combiné avec ref.watch. Cette combinaison permet de récupérer automatiquement quelques données lorsque certaines variables changent, ce qui garantit que nous avons toujours la valeur la plus récente.

info

FutureProvider ne propose pas de moyen de modifier directement le calcul après l'interaction de l'utilisateur. Il est conçu pour résoudre des cas d'utilisation simples. Pour des scénarios plus avancés, envisagez d'utiliser StateNotifierProvider.

Exemple d'utilisation : lecture d'un fichier de configuration

FutureProvider peut être un moyen pratique d'exposer un objet Configuration. créé par la lecture d'un fichier JSON.

La création de la configuration se fait avec la syntaxe async/await typique. mais à l'intérieur du provider. En utilisant le système d'asset de Flutter, ce serait :



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

return Configuration.fromJson(content);
}

Ensuite, l'interface utilisateur peut écouter les configurations comme suit :


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(),
};
}

Cela permettra de reconstruire automatiquement l'interface utilisateur lorsque le Future sera terminé. En même temps, si plusieurs widgets veulent les configurations, l'asset ne sera décodé qu'une seule fois.

Comme vous pouvez le voir, écouter un FutureProvider à l'intérieur d'un widget retourne une AsyncValue - qui permet de gérer les états d'erreur/de chargement.