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.
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.