From bbf958cafa67fc9ffca7da0327aec4121f11c191 Mon Sep 17 00:00:00 2001 From: Adrien Bonnin <adbonnin@ippon.fr> Date: Fri, 19 Aug 2022 18:17:10 +0200 Subject: [PATCH] :bookmark: Version 1.1 --- README.md | 239 +++++++++++++----- docs/images/autodispose.png | Bin 0 -> 4223 bytes docs/images/circle_of_life.png | Bin 0 -> 8494 bytes docs/images/family.png | Bin 0 -> 3374 bytes docs/images/schemas.vsdx | Bin 33089 -> 37784 bytes docs/images/zelda_sword.png | Bin 0 -> 8580 bytes test/autodispose.dart | 27 ++ test/circle_of_life.dart | 37 +++ ...cyclique.dart => circular_dependency.dart} | 2 +- test/family.dart | 17 ++ test/{test_overrides.dart => overrides.dart} | 0 11 files changed, 261 insertions(+), 61 deletions(-) create mode 100644 docs/images/autodispose.png create mode 100644 docs/images/circle_of_life.png create mode 100644 docs/images/family.png create mode 100644 docs/images/zelda_sword.png create mode 100644 test/autodispose.dart create mode 100644 test/circle_of_life.dart rename test/{dependance_cyclique.dart => circular_dependency.dart} (88%) create mode 100644 test/family.dart rename test/{test_overrides.dart => overrides.dart} (100%) diff --git a/README.md b/README.md index 1cbae49..248d683 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,28 @@ -# Découvrir Riverpod par la pratique +# Riverpod par la pratique : découverte des bases -Cet article a pour objectif de faire découvrir pas à pas la bibliothèque Riverpod à partir d'exemples d'utilisation. +Cet article a pour objectif de vous faire découvrir pas à pas la bibliothèque Riverpod à partir d'exemples d'utilisation. -## Introduction +## Il était une fois la gestion d’états -Riverpod est une bibliothèque de state management pour Flutter. -Le state management, ou gestion d'état en français, a pour responsabilité de mettre à disposition les différents objets qui constituent l'état de l'application. -Le terme _"état"_, employé tout au long de cet article, fait précisément référence à ces états. +Riverpod est une bibliothèque de gestion d’états pour Flutter. +La _"gestion d’états"_, ou _"state management"_ en anglais, a pour responsabilité de mettre à disposition les différents objets qui constituent l'état de l'application. La principale particularité de Flutter est que tout est widget. -Le state management ne faisant pas exception, de nombreuses bibliothèques sont apparues proposant chacune leurs propres patterns et méthodes de fonctionnement. +La gestion d’états ne faisant pas exception, de nombreuses bibliothèques sont apparues proposant chacune leurs propres patterns et méthodes de fonctionnement. Parmi les plus utilisées on peut citer [BLoC](https://pub.dev/packages/bloc), [GetX](https://pub.dev/packages/get), [Provider](https://pub.dev/packages/provider) et aujourd'hui c'est [Riverpod](https://pub.dev/packages/riverpod) qui nous intéresse. Le créateur et principal contributeur de Riverpod, Remi Rousselet, n'en est pas à son premier ballon d'essai. -Reconnu au sein de la communauté Dart et Flutter, il est entre autre l'auteur de [freezed](https://pub.dev/packages/freezed) (un générateur de code pour les data-classes et unions), [flutter_hooks](https://pub.dev/packages/flutter_hooks) (une implémentation des hooks React) et [Provider](https://pub.dev/packages/provider) (un autre state management). -Cette dernière est le point de départ d'une réflexion plus ambitieuse sur le state management qui impliquera une réécriture complète pour aboutir à Riverpod. +Reconnu au sein de la communauté Dart et Flutter, il est entre autre l'auteur de [freezed](https://pub.dev/packages/freezed) (un générateur de code pour les data-classes et unions), [flutter_hooks](https://pub.dev/packages/flutter_hooks) (une implémentation des hooks React) et [Provider](https://pub.dev/packages/provider) (une autre gestion d’états). +Cette dernière est le point de départ d'une réflexion plus ambitieuse sur la gestion d'états qui impliquera une réécriture complète pour aboutir à Riverpod. Cet article fait référence à la bibliothèque Provider sous ces termes uniquement pour ne pas la confondre avec la classe `Provider` présente dans Riverpod. -## Installation +## En route avec Riverpod ! Dès son installation, Riverpod se distingue de ses concurrentes par son découpage en plusieurs bibliothèques : - [`riverpod`](https://pub.dev/packages/riverpod) contient le code principale, sans aucune adhérence. - [`riverpod_flutter`](https://pub.dev/packages/flutter_riverpod) contient le code spécifique pour le framework Flutter. -- [`hooks_riverpod`](https://pub.dev/packages/hooks_riverpod) contient le code spécifique pour la bibliothèque [`flutter_books`](https://pub.dev/packages/flutter_hooks). +- [`hooks_riverpod`](https://pub.dev/packages/hooks_riverpod) contient le code spécifique pour la bibliothèque [`flutter_hooks`](https://pub.dev/packages/flutter_hooks). La bibliothèque `flutter_riverpod` sera utilisée pour aborder l'ensemble des fondamentaux de Riverpod. La dépendance est à ajouter dans le fichier pubspec.yaml : @@ -69,12 +68,12 @@ void main() { } ``` - + Le `Provider` est instancié en tant que variable globale et son état est initialisé avec la valeur 13 `<1>`. L'instance du `ProviderContainer` contient les états `<2>` et permet de les récupérer en passant l'instance du `Provider` en paramètre de sa méthode `read` `<3>`. -Déclarer le `Provider` en tant que variable globale `<1>` peut sembler une erreur de conception mais il n'en est rien. +Déclarer le `Provider` en tant que variable globale `<1>` peut sembler une erreur de conception, mais il n'en est rien. Il est avant tout immutable et ne contient pas un état, mais constitue un __moyen de le récupérer__. La visibilité globale est alors un choix judicieux pour le rendre disponible n'importe où dans le code. @@ -83,18 +82,105 @@ Cette erreur est levée quand un état est accédé alors qu'il n'a pas été en Le provider étant responsable de l'initialisation de l'état, ce dernier sera systématiquement initialisé avant d'être récupéré. > Le contrat du `Provider` se limite à la récupération d'un état. -> Il est __trés fortement recommandé__ d'utiliser des objets immutables pour définir les états, les modifications internes sont à proscrire et ne seront pas notifiées. +> Les modifications internes de l’état ne sont pas notifiées pour favoriser l’utilisation d’objets immutables. -Plus généralement, l'immutabilité des objets échangés est, entre autres, une bonne pratique dans le développement événementiel car elle limite les effets de bord. +Plus généralement, l'immutabilité des objets échangés est, entre autres, une bonne pratique dans le développement événementiel, car elle limite les effets de bord. La déclaration de ces objets peut se révéler fastidieuse en Dart et c'est ce que propose de simplifier la bibliothèque [freezed](https://pub.dev/packages/freezed). -## Test, test, test and test +## Le cycle de vie des Providers -Étant donné que le `ProviderContainer` contient les états, en instancier un nouveau pour chaque test permet de garantir leur isolation. +La récupération de son état n'est qu'une partie du cycle de vie d'un `Provider`. +Le paramètre `ProviderRef`, présent dans l'initialisation de chaque `Provider`, propose par sa méthode `onDispose` de définir une callback qui sera appelée pour libérer ses ressources. + +[source : circle_of_life.dart](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/circle_of_life.dart) +```dart +void main() { + test('doit vérifier le cycle de vie du Provider', () { + const defaultValue = -1; + + // given: + final container = ProviderContainer(); + + var intValue = defaultValue; // <1> + var disposed = false; -En plus de contenir les états, le `ProviderContainer` gère aussi leurs cycles de vie et sa méthode `dispose` libère ces ressources à la fin des tests. + final intProvider = Provider.autoDispose<int>((ref) { + ref.onDispose(() => disposed = true); + return intValue = 13; + }); -Pour homogénéiser leurs écritures et éviter d'éventuels oublis de libération de ressources, la déclaration des `ProviderContainer` peut être factorisée comme le fait Riverpod avec [la méthode createContainer](https://github.com/rrousselGit/riverpod/blob/v1.0.4/packages/flutter_riverpod/test/utils.dart#L11). + // expect: + expect(intValue, equals(defaultValue)); // <2> + expect(disposed, isFalse); + + // when: + container.read(intProvider); // <3> + + // then: + expect(intValue, equals(13)); // <4> + expect(disposed, isFalse); + + // when: + container.dispose(); // <5> + + // then: + expect(disposed, isTrue); // <6> + }); +} +``` + + + +Le `Provider` est déclaré au sein du test pour retenir son affectation d'état et sa libération de ressources `<1>`. +Avant toute manipulation, sa valeur n'est toujours pas affectée `<2>`. +Ce n'est qu'après avoir été lu `<3>` que sa valeur est initialisée `<4>`. +Les ressources du `Provider` sont libérées `<6>` avec celles du `ProviderContainer` `<5>`. + +> En plus de contenir les états, le `ProviderContainer` gère aussi leurs cycles de vie. +> Un état ne sera initialisé qu'à partir du moment où il sera lu, reflétant la nature paresseuse (lazy) du `ProviderContainer`. + +Pour des questions de consommation mémoire, il est parfois nécessaire d'écourter la vie d'un `Provider` en libérant ses ressources dès qu'il n'est plus utilisé. +Ce comportement additionnel du `Provider` est à ajouter dès sa déclaration avec le _modifier_ `autodispose` : + +[source : autodispose.dart](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/autodispose.dart) +```dart +void main() { + test('doit vérifier que les ressources du Provider sont libérées', () async { + // given: + final container = ProviderContainer(); + addTearDown(container.dispose); + + var disposed = false; // 1 + final provider = Provider.autoDispose<void>((ref) { + ref.onDispose(() => disposed = true); + }); + + // when: + container.read(provider); // <2> + + // then: + expect(disposed, isFalse); // <3> + + // when: + await Future.delayed(const Duration(milliseconds: 1)); // <4> + + // then: + expect(disposed, isTrue); // <5> + }); +} +``` + + + +Le `Provider` est déclaré pour que ses ressources soient libérées dès qu'il n'est plus utilisé `<1>`. +Après avoir été lu `<2>` ses ressources ne sont pas instantanément libérées `<3>`. +Ce n'est qu'après avoir lâché la main sur la boucle synchrone `<4>` que la libération asynchrone de ses ressources est effective `<5>`. + +> Un `Provider` déclaré avec le _modifier_ `autodispose` libère son état de manière asynchrone dès qu'il n'est plus utilisé. + +## Test, test, test and test + +Pour homogénéiser l'écriture des tests et éviter d'éventuels oublis de libération de ressources, la déclaration des `ProviderContainer` peut être factorisée comme le fait Riverpod avec [la méthode createContainer](https://github.com/rrousselGit/riverpod/blob/v1.0.4/packages/flutter_riverpod/test/utils.dart#L11). Cette méthode sera par la suite utilisée dans les prochains tests de cet article. [_source : utils.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/utils.dart) @@ -117,11 +203,13 @@ ProviderContainer createContainer({ } ``` -La variable `overrides` présente dans cette factory de `ProviderContainer` va se révéler particulièrement utile pour préparer la situation initiale des tests. +Étant donné que le `ProviderContainer` contient les états, en instancier un nouveau pour chaque test permet de garantir leur isolation. + +La variable `overrides` passée à l'initialisation du `ProviderContainer` va se révéler particulièrement utile pour préparer la situation initiale des tests. La liste d'`Override`s qu'elle contient vient surcharger le comportement du `ProviderContainer`. Ces `Override`s sont retournés par les méthodes idoines du `Provider`, `overrideWithProvider` pour le remplacer et `overrideWithValue` pour remplacer l'état récupéré. -[_source : test_overrides.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/test_overrides.dart) +[_source : overrides.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/overrides.dart) ```dart final intProvider = Provider<int>((_) => 13); // <1> final otherIntProvider = Provider<int>((_) => 13); @@ -149,6 +237,35 @@ Deux `Providers` sont déclarés pour retourner la valeur 13 `<1>`. Le comportement du `ProviderContainer` est surchargé pour remplacer le premier `Provider` et pour remplacer la valeur retournée par le second `<2>`. La valeur récupérée par les deux est maintenant de 42 `<3>`. +## Distinction des états pour un Provider + +Un même `Provider` peut se voir confié plusieurs états en attribuant à chacun une clef. +Le _modifier_ `family` ajoute ce comportement à la déclaration du `Provider` en définissant le type de la clef avec son générique : + +```dart +final evenProvider = StateProvider.family<bool, int>((_, arg) => arg.isEven); // <1> + +void main() { + test('doit distinguer chaque état dans un provider', () { + // given: + final container = createContainer(); + + // then: + expect(container.read(evenProvider(13)), isFalse); // <2> + expect(container.read(evenProvider(42)), isTrue); + }); +} +``` + + + +Un `Provider` est déclaré pour indiquer par ses états si la clef passée en paramètre est paire `<1>`. +La lecture du `Provider` se fait en passant cette clef et la valeur correspondante est retournée `<2>`. + +Pour simplifier, le _modifier_ `family` transforme le `Provider` en `Map` avec comme clefs son générique et comme valeurs les états correspondants. + +> Un `Provider` déclaré avec le _modifier_ `family` dispose d'autant d'états que de clef qui leur sont attribuées. + ## Changer d'état avec le StateProvider Le `Provider` est un moyen de récupérer un état, mais en aucun cas de le modifier. @@ -175,7 +292,7 @@ void main() { } ``` - + Le `StateProvider` est instancié de la même manière qu'un `Provider`, en initialisant son état avec la valeur 13 `<1>`. Le notifier du `StateProvider` est récupéré par l'intermédiaire du `ProviderContainer` et son état est remplacé par la valeur 42 `<2>`. @@ -193,11 +310,9 @@ D'un point de vue conceptuel, l'unique interaction que partagent toutes les clas Cependant, chaque classe de `Provider` dispose de son propre contrat et c'est par l'intermédiaire de providers additionnels que les comportements sont adaptés. Dans le cas du `StateProvider`, c'est le provider additionnel `notifier` qui ajoute le changement de valeur. -## Surveillance des Providers +## Surveillance entre Providers -En plus de lire l'état d'un `Provider`, il est possible de surveiller ses changements. -Par souci de simplicité, le paramètre `ProviderRef`, présent dans l'initialisation de chaque `Provider`, avait été jusque-là ignoré. -C'est par son intermédiaire qu'un `Provider` peut lire et/ou surveiller d'autres `Provider`s et ainsi former un graphe de dépendances. +Un `Provider` peut surveiller un autre `Provider` dès son initialisation par l'intermédiaire de la méthode `watch` du paramètre `ProviderRef` : [_source : watch.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/watch.dart) ```dart @@ -224,20 +339,21 @@ void main() { } ``` - + Le `StateProvider` `intProvider` est initialisé avec la valeur 13, `readProvider` vient lire son état et `watchProvider` le surveiller `<1>`. -Lors de leurs première lecture, l'état des `readProvider` et `watchProvider` sont identiques à celui du `intProvider` `<2>`. +Lors de leurs premières lectures, l'état des `readProvider` et `watchProvider` sont identiques à celui du `intProvider` `<2>`. L'état du `intProvider` est modifié avec la valeur 42 `<3>` et seulement `watchProvider` prend en compte ce changement `<4>`. Le comportement des méthodes `read` et `watch` est identique lors de la première initialisation, l'état du `intProvider` est récupéré pour être ensuite retourné. -C'est lors de la modification du intProvider `<3>` que les comportements divergent. +C'est lors de la modification du `intProvider` `<3>` que les comportements divergent. Le `readProvider` ne se préoccupe pas de cette nouvelle valeur alors que la `watchProvider` vient appeler de nouveau sa méthode d'initialisation `<1>` pour mettre à jour son état en adéquation avec celui du `intProvider`. -> Le `ProviderRef` peut être concidéré comme une façade au `ProviderContainer`. -> Le comportement attendu de ses méthodes `read` et `watch` est identique selon que l'on l'utilise `ProviderContainer` dans le corps du test ou `ProviderRef` dans l'initialisation du `Provider`. +> Un `Provider` peut écouter un autre `Provider` dès son utilisation pour former un graphe de dépendances. +> Le `ProviderRef` peut être considéré comme une façade au `ProviderContainer`. +> Le comportement attendu des méthodes `read` et `watch` est identique selon que l'on utilise un `ProviderContainer` dans le corps du test ou un `ProviderRef` dans l'initialisation du `Provider`. -Ce fonctionnement est illustré par le code ci-dessous tiré de Riverpod : +Ce fonctionnement en façade est illustré par le code ci-dessous tiré de Riverpod : [_source : provider_base.dart_](https://github.com/rrousselGit/riverpod/blob/v1.0.4/packages/riverpod/lib/src/framework/provider_base.dart#L657) ```dart @@ -250,9 +366,9 @@ T read<T>(ProviderBase<T> provider) { } ``` -A noter que la surveillance vient créer un lien de dépendance entre les `Provider`s et peut mener à l'apparition de dépendances cycliques : +À noter que la surveillance vient créer un lien de dépendance entre les `Provider`s et peut mener à l'apparition de dépendances circulaires : -[_source : dependance_cyclique.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/dependance_cyclique.dart) +[_source : circular_dependency.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/circular_dependency.dart) ```dart final Matcher throwsProviderException = throwsA(const TypeMatcher<ProviderException>()); @@ -260,7 +376,7 @@ final Provider<int> provider = Provider<int>((ref) => ref.watch(otherProvider)); final Provider<int> otherProvider = Provider<int>((ref) => ref.watch(provider)); void main() { - test('doit lever une exception suite à une dépendance cyclique', () { + test('doit lever une exception suite à une dépendance circulaires', () { // given: final container = createContainer(); @@ -272,7 +388,7 @@ void main() { Une interdépendance est déclarée entre deux `Provider` `<1>` et à la lecture de l'un d'entre eux une exception est levée `<2>`. -> Riverpod dispose d'un mécanisme qui vient lever une exception quand une dépendance cyclique est détectée. +> Riverpod dispose d'un mécanisme qui vient lever une exception quand une dépendance circulaire est détectée. ## Le listener qui écoutait à l'oreille des Providers @@ -318,7 +434,7 @@ void main() { } ``` - + Le `StateProvider` `intProvider` est initialisé avec la valeur 13 et `watchProvider` surveille ses modifications `<1>`. Des listeners écoutent leurs changements d'état respectif pour stocker les nouvelles valeurs `<2>`. @@ -330,13 +446,14 @@ Ce n'est qu'après la lecture du `watchProvider` que son listener est notifié ` Écouter un provider avec la méthode `listen` permet d'être notifié lors d'un changement d'état. Ce changement d'état ne sera effectif qu'à partir du moment où il sera lue et non à partir du moment où il a été modifié, c'est un __fonctionnement passif__. -C'est pour cette raison que la valeur de `watchValue` reste à -1 `<6>`. +C'est pour cette raison que la valeur de `watchValue` conserve sa valeur par défaut `<6>`. Surveiller un provider avec la méthode `watch` vient lire le nouvel état à la suite d'un changement. Ce changement d'état est effectif dès sa modification, c'est un __fonctionnement actif__. +Cependant, le fonctionnement paresseux du `ProviderContainer` ne propagera le changement `<7>` qu'à partir du moment où le `Provider` sera lu `<6>`. -> Riverpod intialise les états de manière paresseuse (lazy). -> Un état ne sera initialisé qu'à partir du moment où il sera lu, par un `read` ou un `watch`. +> Écouter est un fonctionnement passif alors que surveiller est un fonctionnement actif. +> En plus d'être paresseux à l'initialisation des états, le `ProviderContainer` l'est également lors leurs modifications. ## Devenir sélectif dans les changements d'états @@ -378,7 +495,7 @@ void main() { } ``` - + Le `StateProvider` `intProvider` est initialisé avec la valeur 13 et le `moduloProvider` vient l'écouter en sélectionnant uniquement le modulo de 10 de l'état `<1>`. Un compteur écoute le nombre de changements réalisés par `moduloProvider` `<2>`. @@ -386,7 +503,7 @@ Initialement le modulo de 13 vaut 3 et aucun changement n'est encore réalisé ` Suite à la modification de la valeur de `intProvider` par 42 `<4>`, le modulo vaut 2 et un changement est ajouté au compteur `<5>`. La valeur du `intProvider` est à nouveau modifiée avec la valeur 22 `<6>` mais étant donné que son modulo est identique à celui de 42 aucune modification n'est apportée à l'état du `moduloProvider` `<7>`. -A noter que cet exemple n'a vocation qu'à présenter la théorie : l'utilisation du `select` dans l'initialisation d'un provider ne présente aucun intérêt étant donné que le comportement est identique à celui d'un `Provider` effectuant lui même l'opération : +À noter que cet exemple n'a vocation qu'à présenter la théorie : l'utilisation du `select` dans l'initialisation d'un provider ne présente aucun intérêt étant donné que le comportement est identique à celui d'un `Provider` effectuant lui-même l'opération : ```dart final moduloProvider = Provider<int>((ref) => ref.watch(intProvider) % 10); @@ -455,23 +572,23 @@ void main() { } ``` - + Le `StateProvider` `intProvider` est initialisé avec la valeur 13 `<1>`. -Il est écouté par le `StateNotifierProvider` `incrementProvider` dont le notifier `IncrementNotifier` dispose d'une méthode pour incrémenté son état `<2>`. +Il est écouté par le `StateNotifierProvider` `incrementProvider` dont le notifier `IncrementNotifier` dispose d'une méthode pour incrémenter son état `<2>`. L'état récupéré par le `incrementProvider` est bien celui du `intProvider` `<3>`. L'appel à la méthode `increment` `<4>` fait passer la valeur du `incrementProvider` de 13 à 14 `<5>`. -Après avoir modifier l'état du `intProvider`, le `incrementProvider` est initialisé à nouveau et prend la valeur 42. +Après avoir modifié l'état du `intProvider`, le `incrementProvider` est initialisé à nouveau et prend la valeur 42. > Le contrat du `StateNotifierProvider` va de la récupération à la modification de l'état. -> La classe `StateNotifier` est à étendre en indiquant le type du state en générique et de passer sa valeur initiale au constructeur parent. +> La classe `StateNotifier` est à étendre en indiquant le type de l'état en générique et de passer sa valeur initiale au constructeur parent. > L'état est stocké dans la variable `state` avec une visibilité limitée en `protected` pour conserver une implémentation étanche. > Les modifications sont réalisées en affectant un nouvel objet à la variable `state`. > Chacune de ces modifications est ensuite notifiée aux objets qui le surveillent. ## ChangeNotifierProvider, le vilain petit canard -Jusqu'à présent les états se devaient d'être immutables mais pour des questions de performances ou de conception il est parfois nécessaire d'abandonner cette bonne pratique. +Jusqu'à présent les états se devaient d'être immutables mais, pour des questions de performances ou de conception, il est parfois nécessaire d'abandonner cette bonne pratique. Le `ChangeNotifierProvider` répond à ce cas de figure en laissant à la charge du développeur de notifier les changements apportés à l'état : ```dart @@ -531,7 +648,7 @@ void main() { } ``` - + La classe `IncrementNotifier`, un `ChangeNotifier` avec une méthode `increment` pour incrémenter sa propriété `number`, est initialisé avec la valeur 13 `<1>`. La propriété `number` de son `notifier` dispose bien de la valeur 13. @@ -539,20 +656,19 @@ Après avoir été incrémentée `<3>`, la valeur prend la valeur 14 `<4>`. Aucune séparation n'étant faite entre le __contenant__ et le __contenu__ du `ChangeNotifier`, il est retourné par le `ProviderContainer` aussi bien en tant qu'état `<2>`, qu'en tant que provider additionnel `notifier` `<4>`. -A noter que la classe `ChangeNotifier` est initialement proposée par Flutter pour fournir un mécanisme d'écoute et de notification. -Le `ChangeNotifierProvider` est donc parfois utile pour migrer d'anciennes applications utilisant le `ChangeNotifier` comme state management. +À noter que la classe `ChangeNotifier` est initialement proposée par Flutter pour fournir un mécanisme d'écoute et de notification. +Le `ChangeNotifierProvider` est donc parfois utile pour migrer d'anciennes applications utilisant le `ChangeNotifier` comme gestion d'états. ## Détour sur le Future avec le FutureProvider -La classe `Future` et Riverpod partagent un même monde que tout oppose. Le `Future` est mutable et utilise des callbacks alors que Riverpod prône l'immutabilité et utilise des états. -Le `FutureProvider` est là pour les réconcilier autour de l'`AsyncValue`. +Ces deux conceptions, radicalement opposées, deviennent compatible en adaptant le `Future` par un `FutureProvider`. -L'interface[^1] `AsyncValue` proposée par Riverpod reflète par ses différentes implémentations les états que prend un `Future`. -L'état de chargement, de retour de la donnée et d'erreur sont respectivement représentés par les factories `AsyncValue.loading`, `AsyncValue.data` et `AsyncValue.error`. -À cela vient s'ajouter la méthode statique `AsyncValue.guard` pour transformer un `Future` en `AsyncValue`. +Le `FutureProvider` retourne l'interface[^1] `AsyncValue` dont les implémentations traduisent en états immutables les différentes étapes d'un `Future`. +Le chargement, les callbacks de retour et d'erreur sont respectivement représentés par ses factories `AsyncValue.loading`, `AsyncValue.data` et `AsyncValue.error`. +À cela vient s'ajouter la méthode statique `AsyncValue.guard` pour adapter une fonction retournant un `Future` en `Future` d'`AsyncValue`. -Pour faciliter son utilisation, `AsyncValue` dispose des mêmes méthodes que [les unions de Freezed](https://pub.dev/packages/freezed#union-types-and-sealed-classes) avec un équivalent au pattern matching avec [l'extension `AsyncValueX`](https://pub.dev/documentation/riverpod/latest/riverpod/AsyncValueX.html). +L'utilisation de l`AsyncValue` est simplifiée par les méthodes de son [extension `AsyncValueX`](https://pub.dev/documentation/riverpod/latest/riverpod/AsyncValueX.html), inspirée par [les unions de freezed](https://pub.dev/packages/freezed#union-types-and-sealed-classes), en proposant un équivalent au pattern matching. [_source : future_provider.dart_](https://gitlab.ippon.fr/adbonnin/article_flutter_riverpod/-/blob/main/test/future_provider.dart) ```dart @@ -579,7 +695,7 @@ void main() { } ``` - + Un `FutureProvider` est instancié pour que son état prenne la valeur 13 après 100ms `<1>`. Tant que le `Futur` n'a pas été résolu, aucune valeur n'est attribuée à l'état et il conserve la valeur `AsyncLoading` `<2>`. @@ -626,17 +742,20 @@ void main() { } ``` - + Une `Stream` est déclarée pour retourner la valeur 13 suivie d'une erreur, le tout entrecoupé par un délai de 100 millisecondes `<1>`. Tant que la première valeur de la `Stream` n'est pas retournée, l'état conserve la valeur `AsyncLoading` `<2>`. Après avoir attendu 150ms `<3>`, l'état devient un `AsynData` avec pour valeur 13 `<4>`. Une exception est levée 100ms plus tard `<5>` et l'état retourne une `AsyncError` `<6>`. -## Conclusion +## L'aventure ne fait que commencer... Ainsi se termine ce premier article sur Riverpod. Vous disposez maintenant des bases pour en comprendre les principaux mécanismes. + Le prochain article sera plus court et portera sur son intégration avec Flutter. -[^1] Les interfaces n'existent pas à proprement parler en Dart, ce sont des classes abstraites avec des méthodes abstraites dont l'interface implicite est implementée. \ No newline at end of file + + +[^1]: Les interfaces n'existent pas à proprement parler en Dart, ce sont des classes abstraites avec des méthodes abstraites dont l'interface implicite est implémentée. \ No newline at end of file diff --git a/docs/images/autodispose.png b/docs/images/autodispose.png new file mode 100644 index 0000000000000000000000000000000000000000..242c0327df46ea4f82febc3f4a2776c74181627c GIT binary patch literal 4223 zcma)Ac|6ox{~t?SYo(}0=u);!%DzTSmKX{%%-A!;AR<HdC0t>UYr2*pWo$EyeWxzj z_hm?Eu4~KKvSzH$x8HsK{5{X>`Qy8s^Eu~p&i8%J=l%YiZ`?x@eI8CQCkO=MF*Jah zfk4bYz`NHk%)osqv!N7tF!`G4>wroJt}X)w)+hI1_duZXB(5XJGeDWc+W_ec0`a!} zyqG$@3eh0Yxr>I-dlmt9Ycuv9sY}ftH*GGCSJo)7@?E{Q6aDfNgFUy-f&157E-^51 zzABbUP@Tirw=HLP{%z4vNxM4rc|~>`+C2m9HiFKD_2wbA+MoBqZrJaLj?{Mtrg7QV z`M2~DWhVzib5!;&Ol__-;b@myL^O+6CpHe7zUplC&xN_YU;}|XbP!CSG9Kg^&_^XS zKL|9H3<oN8|NqK}OHk3zBO`pj6}p4KQDkOW95k8C%%g{hxWtY;1ICe=2VRGfYi^t~ zG-UC8<8z4$8#FuboB9jugp!sKl$jp$x?eTgZ9bp%-;JH_@_>z9qZ2MFn+IMoCff<n zA7B4$_BqQwTfilS#V1jT0&+c9!Kq^U6pqZWcvNL!OJr`S5$(6`EmlhE(?&$FiIKv$ zEqXAMlKFfQ@1jd&47;U=plE*Y><VPao^f%Z)@_-sa)sJ_zIuMhS!Na(6v3o_$G*HO zzc59VUrJ;8W}Gb~|C6~Vm!2qNZUQI$qTB35uZL5C?|%d2zd$!FO)!y2?Pf3-L(=sP zO-<ydY(w0@%&ru<eH%4x>R@v6p9(OY(6u-1n(*YUr>}V^tNrMkX*9Br$iGGkcSp;m z*Q?hO^K(<1dnZh_8jp`F#6p}Df*VW^0zK)rZe?nhKjMLg>YqLwwYt*y@2VHxuj;W< z3H#LOZ@Tm2C<5-Vk_`WNruB4ts_4&k4{sf=r5Ih_^pIY4WkHJzOs=;9U<uG?>(CG5 zMn+;9q3Fe)LyQ_I@h3#_CwE1AVUSe61V*{o+0(ftj2Var*c3}B8=I>eiu8ch+SNb6 ztGF;mbOu=42^c50Vv-yd;IP~yRf6+N>f8CF)_tR==am{$I2$lY-DnZ5?Co8Q+w}Y| zIYL>DzSabgHVe=#4qb!^P(z0l`8`V&6U@5(#ot-(iXRxn|FUg1Jw09RD+7jLk_bH5 zSw_<YQ5TIm(|;=<a+}&epjD##gjaBS@97F4>G<}?F^*P=H<2*b1&K%DKYH7cE?zSU z*(JL$#kdGOK0>)VF|A`X-pd3>cvQetcAoUC8V@&oc<r^BCFUFl>jnDba*OK@Cw88k ztR;QO*u-_Lr~zX3c6JS+T8r63iZuDx%O^`KP2L=3d3$wA*lN_TB%KGAbyEB(WJM)1 zH3hC>q?8%*;!p_^3y&d^d%k09w(lKj3t{5i`;q-xhzx5KhDo88J@TF}6YASH`pFq0 zyTB90+Ca#3@nU>lo*%Jufu2b-t7x*dX0Tmoe?#q0TgN&cOl#ii#|)!T*7}w$Ug3m! z_3_U$`PF4TWf|1X>{7H`kqO(!cl2k~H7LkBEyKo>IR*N(u|~Iq1os>dZkZo?=Se)A zZ$LbMX=6<wuWHKpMpjQcmrl<pQ|9*|CPmYQ$Fh>XG#l}&yd<pwj)IKr?7a=I36zzy zRX;uHpz)S{3)zJ2?X4}?*q1MXTl0o%Qv8_}s3tWT`a>#NfE;h(rr<mOi7218ZdUhV zCiKO@%=qFUtqF^qAw^;¨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 Uv4m*?_-Oz#yl(<6)p3aY7ueoJ!2kdN literal 0 HcmV?d00001 diff --git a/docs/images/circle_of_life.png b/docs/images/circle_of_life.png new file mode 100644 index 0000000000000000000000000000000000000000..f4aba09720b378142e282c72773bef7bd955baf5 GIT binary patch literal 8494 zcmb7}2T)VpyY53T3W^dC5D*c;AfQ43DN+RlDGCX_6G}i(dXX+FQk32yp+g8YRB3|r zUP3R@rS~HBY(Bs9zjx-&ojHdY*d)8HynC(Z`Mpm9)l}rEC>be1AQ06H1=-gi5TQNr ze+oGv@OOtItsK}8IJ}mZ2IY6(UItzeTSzHOfj~uHubdi_0Iw<DDrh@^K-7(wzXUCI z*=8WnoyHfkQW~xX>q&-cOv5!TZh@;m--RgG7Z(*iA|$@`u+R^&-BNr-E=NW>QJ7$Q zgw!R~MAWI$c6G$+=DzBUe!<#)TxFWaz*L88c#g<G_X1kzk;{F4uT~;{Pc}QT-@fwV zE3dv**5O%RVA3Y>iaO|$*^{_w|L*gr7NZF76!DYt8C_s(pjcwu<tK|J{oifOOXzGY z$@7c+j6PS}I1%6|>v?6`b6YVmx!X=)TU#YdD9bjKcrH&;ZIu31<a1IT5~D+@K(G$f zC(6E(nr>nO*LoUX-fc*LB`iGgfrk)ahdw%LmKp`l1>}NnT7p3|VK;)_@9@^rMS36q zE*E>kFWW$`VIJ>#?{`OV+T%Eed79A~>#!<3()kTd?VYpkv!p#ui=hzJO5On?ztMe} zwDg%cDwJf{0Cc#-zWEfEhyV6rkraO>)GKA`V9k?2T(>x12Tx|Jh-Qi_f3IT=ldh3Y zk`N5S#Rgo7H3*2_g5W593e))?XQZ8qF;eV|DupG?ZcnHp1YsI?vqVdA2&eQq^&;C@ z>&m^C-X-?f7pr%^lcqmRZrj|hj!ZUqS6NA$oo~T`6qgP8=qSX6KDR?DyXWi+mX8&; zwVUw2*fqO&o8xA+fZ*=L($<vbzA`S7fJ-Mwfoao+4L^X1fs#pT4fdx*>QJ^WGCt?y zP<D5Y55UM_XGJ8{{a&9hwanjF@wj`YBwcAsOWG#yB))_$TBl^{pGMu_u*J?M=$1+^ zq{zy1R!V$-yV5x}sE^47(_NTy^dHPaqQ5Qj#%f8TV4x4rdCoG_OBCC~P|H!C@ttc; zyEaLv8e}Ivx7od0<_!ud<IbcZSL*fVi`~Xu@N3n?Ax-D-h8%vGz0!DgP2+6|xZjFq z(wD`LZ~{;iD*2pC=G9cEIdi+#!(jz&PJU?>Gn)g)Cmr4B+v<i2-dT59TLy;D=AWE( z#b<F3U_PC78!q?Xf-9uFie~-OtJkAASe7Iwqv3x{ipYjV`8H>qc(iXXo9_vhD+VkJ zf_D{Qh2euAaPLRMD&L7%!!Qjd-gzIY{j{Z|+{g4B8VIq3ckaA4Y2%dOgY*<U=pKI1 z{r%O(m%>Qy5I8G)4@~u~1q=A8VP!w9={>8~#`OJ2L&dM%*s`@K>7@OKN%iw#!zH#d zj7+%JIs&%ghys|jCjm5uM_*N~sxb(y=g^;Bsu$3HAtddIUD3=wZ-J;CLN<s=K_DZ~ zejP-e%T;8grltG!6CS}{2(YY_k*ToC#@sDP6t)k>0hAjATH)$u(rrdU$#gEY;U&@k zW>dfO)1>IFa3`gaP?%x{p>O@r5FIxWfe)OZPz<fsx_MYaIHGK0XD1{eAm+C7A<7pd zi2-S`SUL?8Vkyai3C)3i&ln;{Z^wJ|Nj$&Iv?ZRp|7%>%i`Q$5i}w@A2Ss~xeJ;-k z{+;FR=;9)hEQ%8zp<&*1+bQN`!VtK$4$PE|+kB$tove*|d4E(4rQ!=GA=V+Of1-A9 z56zprF;;DVFs@7Qbobqyo@;f_yQ9hl!wX21V$mO|NrJyafRc;5wrt|)!MRVuh4{p_ z4vxhA17-d2gezApVV5&fmNV{Ux8A9NW%}2W%pW5a@0&eSsp$1qZ~Wc;LC*cryS=p) zj%%D9;lO<o>#~T<u@Wd4fiIlkdVJHWog63WQ{`xyal24A{Ul)~Jqt+;;pM#G<@P=w zI5pzrY%QK^>tMMk`~;&~35bhh2<PSoT^8{=?TU6)DD#V{>iW^5a4oS(@Y&wiJOYp; z_;P1t#&~(d9AYXn9URECbi0gB%$`W{MdTj2Fi_afK-Is8vZ#=73iH8Pl#=teI8zGE zL7*mudpD>*nOa%3{lZd^;;Q~tO{c=&CPd%l+#k;vky*$h^7aJ<1a9l9Q&*3zrx`yf z+o-UQyer6?vYotQ(FFos{ic}FFjFX1xnY7;yjfo@sdn1f-$DMA-Q0xhtWJrmRD`hz zDwn@_e=8)|TyERg`jpp}f)u53wY?O=={rZ0!gs?W;A(M`{gEF@#F{YfWiRA<c#TJL zzX;L8ef1oE_vKsDy08xd%A41P9x;`iahep}vZl~tP~0;ppr6*AeDS5-X$hw|ul=x= zZVx|Zb$R;w`kNMqPr~#&=rsJ^=&xTHelv08ZX(j?>(*Db7{tnTxE<$nF|hu$iIVww zb{Dan?+j*h4qlyI;T#rP-6o?Z=9$0Z=g0O`b03S+LnEv>g|zzA-YOg1p~#WOHbsB7 zh|xygP1Qra9Jt}8Z*|s0RPQJ#C|Df|?+$oRi-f&<18d2l?b}XnO1P5u*a(5bkEKF1 z*=t~>&yv#PgFR+nOFbotqS}Y=nk!<$7CR1MRZ5sgdIt1D`CPPR+7%<qR>h@lp`9;p zP%OrU%Ppp)!wto(i>j;F$lyl653V%OfsNIj(|3U0uvC?>AW>q}Yp|J-2;RK9-=FFH zeKPMV^2gCp#lZ5!cbCn<L0ZHZC2l3CaGFH@w<VNpdPdzkfRs)nJx_F4E!h@92}#eX zv?`A1<to#nr1eHM&uRx_u{<KVB(pLtb!nmOiC6yg)|BN+MC078W(k23#%Vp2tNe0q zti>=$I7aC!S#Mq<?sXdbWL?D?rmLLG9%Kni4pKx?(P?BC!0;U1=<jQwSjCKC_yfn5 z*)im#Pegrbz|h6%X?5d_mbSLBe{MDm9$N6?OtS6$hy3_K`AiS=)9Hm2;%J3(*a(b+ zlKUkeuK9%#giALyY=2mn1kM(vxIVc{yCnTg_?^M}!9p^OIb>u{g^-WhSvKv}(5=EJ zy-2JYI5#*M4pRwk&tz*d`!bI{4SzYNwNr0&FPSAV>E+!XEi+L;VVUImblvEYEwSCl z{SMp~y?Qo*e!9`=tTuV6=rt$P)Ye%7HLB{YV<Fy@8AmSp<LB2EN9J<f8cUNDXGHpg z<)5q&SvoEC(c}h)O+i3LS=#5n{K*<86RDL0v6VD2X(3Reht#;L2wHIN)yu`GW*2@O znMk7?h)7xep}JXQ?$hK8cOmtcj=I!{$he#~yiY=eNkAB-ig0|w)?$PE><@pk5fqFg z?q$`aE&IR6b#*D1Pd2+1HE6M{du$ab{YMJuU*8G*rfxb~bha3aS=XXu)g?j21H$?F z%7flbhQTV1igX1M&Qtx+kPs?36oe81_K_>!4cn>`$w_OoDjtkwe%oAolnA2)WitXs zk;<-b=2T|w?NzF9&(2^=be;R+4{M$XND>N+w-D53)-SO}k+j}-Opbx)88X_7hRzTK zy9b;<W@KVot`GWG=RfxLu!_Vdm_!gIio#5H+qGBHNxMUA?d(bb_4Qr)tJI43ZUm0T z#V{U<i+kt#pH@MIQZ=l076Ul>Jfc4)=CgNgY^a!xSCQ#}uLBge8us$OCLG>cz$?#$ zz&{M>+1S12(J=GK;Lmp@pT8H}`5?_!H{AnR(!T<~0F;{NUnBXytml95c5+u&m)65( zN~0KHAqH<^DM|iEQ0lWl@u|^Q(g$2`dpGXo#^iSwQ&a!{_CB%lD(fE(mj>XMWMpj} z<gRhZdfF-KtP@(lN8DzFKm<^ikIJI-h=*4I59FEYA9p!zWO-_CVUWs(!C-PUz9<v7 z6aG^T4I0IGR<AuNkC+<#sDPkdO0|Wd>sq+!#z6P3i%w7V*uk1_)>%Yaq%q)(jz0&H zcf+)*JUg6!qsDEoxQR5dPpTRmw9+KpMzQhNtcRQ=vo+1$HXr@Ro&1ne;(hFIx|Y0u zSDY-=7nFZ=njN#4+z4_$-1TgwUSNxdN3@y!Ub@EIr987;`!mF0da5cLob!wL!O*H@ zQe6B!nZiH5#{amW?;kaIQhcqXc;AWPHG5KgVEOsj_?-ChR?SHsozX2cuBx<jVSSZ4 zX`KyWe*+(g_ZfHEd%G6Yqs>!)>z@Z#Z^nf=@Ti(P#eD)SIQBR!A~IOXmV+%6u6c1T zR4`Bk6>88PQ26%If-F%fND5B>2!w;&>4iMHIo6iM`4ud_ieXKkZ=-K9hR>0w!t9at z_~dFg-(AFuBC)Y@*E3}}I~VESGpKIN<ScpE79`ILXv^uHM_E5R;>$BoyGnzDB%L^k zKpb;#D>aJGOnY{&kW~FO@`2d+TD619>4q&n$J28fdkh;gA8+<#*}2TF?rAecaW$~^ z2x~Y|l<a?xchJ(;cQV8|AoK1`T{Jt4c#*S)3rKg>l~*~Qz+J1qmY8xBxh>?C*U{4x z2K#JczW}{ZC)%Rks(slIq37;8+dcVw2y`9Xz8t!k8NP7>z45QV3xcwl9bL<7Yr82) zec-+nd3kw>Zlxg+sSo;0>?WG$f=&1(4x8KmL?qI3e+3>HweA&>Jk;X7h&BK^%E#Yq zVWIy)0zwevh*Q46bEu2ql|+8cRBvzZd#sT#Juo4Tw$iR?@k@#+c$E2v9J@fU`~79l z$}(@emX6Cen%PXgTi|+rl;o@jCH5<<th7?gZ?J~4w5@rmeMhO8cplXAZ+g$o1ZOi( zvXm(YSv$=Xb%;90mlFT<$I0)^Ic9%mQ)IP@)B(hukzLc_=8>Enf7;Gnk*N|_2j5a+ zAJDBZYnTdQ1f^$~Fn4-eRgn~9m^ue|l=k_Zav6-@>y<9W*Ah-!NBtIEayZ3pU<quC zco}QEpQyN|Ckz-1rh7r0<oKB9JTPCrWiB(%lC}f0XVxB96b-sg>RGw*4NhT;S`iqN z#LV6Zk@IxOFw}zP;o%ko0NYw$&3@ImiS6#LrcJp0%dz!SD15-e-#>=(qlI5+jkb~` zmB{SRL%4N7w4T!i!l9=9ea4HdfSfdjVB%3%L+9#L_INhyo>C)~bb+MQZee_6+}B)v z?m?acSS2&uFte|dc2KSAp%k7WMu_W^8kgg_3indOtg#kGd@8M?K2wz{MR)(2l41Ic zUaLGB4jzU(B`Wq+Tw8+d)jMFIS!(%mp~QIiFX3%Zn!hNKEYNDe*8>+JkU}#t(Wei} z3ZIrDe(AKS&`^*@8H5&)7{lW-GB^}#GY8x!4%+28h3V<8HR>=Qd6jf5n1m2OZ&S;g znzD1RJtRvR)jj38{+B+WDun8{rw(z$tB4R^Ld%8T<Fv%?c9fi}ShBds0YK^MnOI58 zmyXm4S{<D(m6l<yeR#&)&{dMI93KBFxD^*h*0+zl!ik!Br2iFmxl=zWsXEK;jnnds zR~eX*Q7q+w9K$9ybj0gqe7d;Vhf&CO0`;?<QnW*IDKMnN;*#(@-oU)`&VKm<+RR8q z(%X&}=e|u{@+6yNvwAnQ%lry4p`rH~6fu^B&lUJs72aO*gScy5J@E);t?~wy35Sl6 z!u*_<i~jUa7no^bLTjS|V;#DsmiCd;*CO-2CXp?`bQ&m_J*hQCwlBaf2n3>O=51$B z4>xN;K|EahY3==e7Ju!Y7ir`fN0!&Sc&>d`YKM;KMtv;$k{vZ+qv1bqyPQRg|2&0+ zJ=oR1{;|}(5Fs(u1w6n~<Zu1!iNXcWC-yzLp>j6yoW3`Ox<{#*&3Fi)D7+3DqQM}J z%}rE^I+IOpr)@L%!x1;3EYnXivSuV5&NZE+kw|o(O>Ukkb>2!KMoKz2h^iw+xh(JM zhIX#to*~}EZeB0@<}$q$*XTvV#rA;N+>~ZkXjy4tv=1qC5W*4jN1Zv5x+Kht=EIGH z3gpz=^(&a7HebMjwSd|C7izAm6oPJMH(&8xh^<;WS{6M77P~(q5*qhXaKj^h0Ie<6 zkV)IDLx_~bh`xA*ZkNQ=6Hi?^oAt2MTu7>St!gF*?qvL%A)%igoLI;#=96W;2YB#D zt%v5a*-rpf_LaT+Zp14)@{pd9a)m%$BDRzOmxG0CYHC`zk3W3?X8{}qXl}HaB#FlM zQFx?Gi*ry=klY6d5th*5sOwYR>C`nPZ+DnbqKshmvu1K!Bc@jNO$&J<lYU*gTOckN zm7kkdNl~85z;>HDO_h%pxaTJg$ii=%nnU~pl@LVBTG~b&cZ}A$q>Z4EPz~qWeJ^{c zKtH|v7Bz+$qy&UO1E`5H=peE^=ht^b>OGIDw^wc1QoTPve6~5ere%;<_x}DP!G;x* zdY}gNFKdrFmU>i0h2^6eH_vx*tBy<t1$IyA3hEe=Zq47;M%oxWU0q*orU4i70wal= zmN>3x@rWF3ZR<ChFc2SoR}3zI72nO#Kpte!$9(h<R%g7nk`=BVGR;Kj1N6W3?~}#c zq$j%qT6k6Bp3f~9iioG3wdNx3bWdIy(e2;Q3{KBZ{s8d!q5FWiS*}-=2b}k~&j&6A z8yOqh2~Bb~#7&>s`#5AFJ3YrnS8R014dg?){1+A$bUf`~QTzK&En$s-hX9t4_zcGG zUOU}4L3{j1Mo{9>)pfq3sa#7*4C+f>etwzDD6=O|#NptX`+AA(w4QEI&ErSnzCk$% z_3<TmDY^Gf;CiprN~K(j2j!XK<iN;${b^2Uv!^Ow_jG-Uz(P^Tu+(QV9A$3z;^N{N znFM=X|GDZnL|fX9-Nn460ArK(G$oBX=E<Oges!g!7eaT!it}s#SD-bFPja(DAV`)t zAq4-h&zgXlw(Fpt>=1;E0>lEP`P+*>{2BmQCCOh_>>$E!==^QN3&na@^8W{KZ`J(M zwHJy->V|2#@T{(`0=xzGxlAoUARnv$-$pB015z3?{BRS#)#VM;9Y{YqIyzkI&0WG@ z-rx2K0m^5@2{hh)mIAbtXLp1*nMIY~UHs_DuBfVN&jf+*964Zgb#-Un#?tLX4QE*m zoN&r73lT7Ag#Ie<SIBr>q!nDY?|&izur3#!9j{tZtpqta)^9~x&`Dz2r4UhPm%o0R zG_?H9bfzfCWG6Z4%SO<F__W)XVxA{99BRoo)G(1k5~siY4|qK=B~~^DV-uPzPQ96R z2iihsnZLJL-XN{2-Os4r|ERV3fL}R2KJFYeo2#`jKT-W4#@sR04Zt{8>YTVnq=cbr zG)G-A!wR`2SmVk{Aj=zTwuIXK;VDBqD(j|`X;-fC*B>)fuIAr}`edn-@vJ?~`{bv& zoydhu%OoFJ1y6o3fPl3-eH1$z(p&C#!;E%`8p*R^V?k{(z8iBuq5~1$UdIOMNC9`L zy8Xt<d5BVnWKl-jX|bJSC2;Cwg*Hac$xq}lpxMAGip3LNWsihE=u2_0wRk_Zy&<9M zkf6nBaGp_u-QAkLSh557@@gNB@qDty_It?tHU<sOvPC&__i+nD_afUVFbS400{x5( zfghEh)SD8xbsi8Zl&_zkz-(i2T^_^4#Kg?0YX_j9ASUb%)ir&w(7D`jU<a<J+tAI) zs^StxKa+f{KC9V(*G#BGVlM6RT=Qakrx+<{a8YqMk^U7=e)Z00_=8FpYG$6C2%TGw zdi&iT62?$Jlh0}R`jOW5K`WJLj;6(^5?c!o=2)-}Nv6~%Orxpo8Fvn;>G5Q~uFJH^ zK5#S&*1kEYitWv@7n4{&n&nF=arfo*vvjh0eCy!a+xUm<m+6cLDb}kPC|KrWkF(O@ zXwgbqZD&_Qr_*8Yi$EBaV@@Uf!8PZ@l-@egHrMKlkgUTzPoOiwQ{!l)F#jiuGDYkR zo-%1_;fH`EZLzSncFKF>RtzgQ#mXVhiKTfGEtg#h-<-VIz9O;wtIUYwoyWdek52?} z88mZxnN9}DTV~O4fUW_IrTP6#<<AGGkrWDML>)=YU7fCTD~2Vx!oejB3c{fW;f?YV zIs1(VGJ{R?f`$RU17K3LttVAaJP_!CSvKdYwTu<$wZDsM6Pc*>mv~=V2ObYQd@dS8 z$9=7RFtVV}7<^k~4^4E(b{xiXSjS?6v@&}GVncfl^i8B+yhXY_9vJ8CZp;HZ)|BR7 z+P>}oop=$B)DUNKE<WS&g6)s3Qn^(doU$brxp@fRHtzzlje7rLV0VE;743Ue%RjGZ z0b5F)EcSnk;5YFKmb0<(Uou_|-Bn*~Le`7(L)+qMh>kS{xHKDeqOR)vQrj-gts1G< zc%3s?LYDm4o?1;Yk2E~z2_4J#YSS!$5yiNgzMWQJGZ_&!XY?#(HD`0<c^r3G&W)En zKP1wWnqbS(XqV4S+2BDU+lj+qpK@ZRFzW|3u-B2`Gqb*?GV10YP)wNCgJkh7N9MYy z@s)1}3SJZU)kB_?odb((?E4yUxm!5Rzh<oxnGT~wcN01M?f_<2)IUgzSIncucHgi5 zqMyPzRlL`}I-tqIP(@Y|j0L)><V)cwB^JoW^C<1{Es6AZR;qC-;#X#k$QI~^V!v6o z!3;6m3cZ|3vK;S!lzwhd-BvJ{MHkOnk5*cip?c_z)yanKP2c}eNL1#NiaHtLVufbh z%6QGhB-79t+J;f}D3St`2S_h%;_NA2LE8r)yoKP5kJGyQp-Bd=YqNrJ$X|NTp(u7p zy90Do>RyiUdg2wQR1NG$G3H2JEmJ~uE=^`^_!ZBvykBPDx4mAkQuIH1&6=PZuS~~A z6@4#;flZT--jXrnMTT2(DRNLw*00)Yz#LjU@}2h2vfO}`xUI(myNr;ZVj#?SiQkJ5 zf9wAx-V^FI=#f;wPTBeSQtjNnyS6C`r1KQ_WYSiMd-D!Xv$oGE(gCd!nTwCw<sAPy zre)e7lVH@7ERK81HGs5^+WR@G(1b?nz?|ta@-2pvPSefA?oZ@F_~#=ruM%*sHYh^F zpCcxlugl8ImtET(dFuq#YcSTdXY`?`i$ZnA0Dap|R7iP10s0Q@HYH8b<h5HBVxD9T zYSQ{=D3O1F)Z_0^Mqo`-NZ0g}{SN-T$3<w^jH8IWynNm93U@mW--`@&6`Rz3shXOJ z@4O|BT~r&o&y(DKkCdJ%wryu;rxJxe<c^BbN&-l#MJ0u?7SSg0)P0>_W*k?IRqZwc zs1$j$BR$4lbD4CCyvl{Mx+Y#ehSa;0h0D%8ot<3M^v35ej2I(@bmhDSs)HlybxLUj zqU;6Zl~%BfIyOf4xw*M546r74rA<=`mHtrD!E7|Vz`#50gA$0t*0Y)>l?&iS=(_91 z^(E;fE*NGvON6Vuu=%G9Ec?l^ydTNoxq^g({$Rq(YZ~D!DhioY<`zl`0;2DEG|}xm zN;{uVb)#{}h*zB%d1?+tQczS)P-hE=ES`(K2r!JnzB0O@8@;HHI@lE{@V<YJP$xjH zgKC%$bFDM$LM_6~$mcma92P-tVpw*KxFpdZ;X{xUs+Hga-tXFmd^08@^G8x|lc7Wc zz^HEq{`?VrHUa17Rv5W^s40so(*Z!`Iy2wy_l4ts+eq^d=xj9vAb5nE0bbiR<y21E zid16yrXLuQQIF1pm2;#Tnwil10Pp5Zh9?(2W<m4oqYu4)#M6L)JaCi^3sGUjOj#1= zQ7zOW-!~E)lJP6NDTN>sA@40`N*B6ER||>+eMn33keQ8*iE8`k|Kx^0pQfgA#3dy` z?*gA=73+7L$(ZsOZKnJn0TA1qnbkXHFE1Y6d1hdCUFSJ)`Z^j&eG=)pgST9#``2~z z2(AEMN;m+xAwL$s=`G&6&{BLEB>}M%hWWR2Wog-_OFEI8yy2B{67E2Hul{$N=U=tg zC1b|C?4n}h;`OL1o<gIU|9%xgU|4K-+Y%g0%KRi{hgE1nW2>e>W#3JtSG(wX9T5Dq zHO;b;3Ea5yRevtRK#6lmpJYADKr?Gw*U#xLIFWoWIoo(?oE9kJeea{g!b2EY42M#P z%Y|E&bvFJe>gpYGeofw*GQAw_<<Gg83*jju8y-u${p3PUJA+>W+Q`mp&T<z<e?GCH zVMb2|t=+uFUOA^k6|cN7Jh{j}^M{e;5$*G3W%9kO8*h4}KDRw&=+TyA@(fG9r+v{P zaVpM?IMmKb5fS~RcfN3vC&CT%9lL)3(^YpV3HH!he72sR_r)tWqtfY+M<gGz4-sYl zRI?QkI`dfQIA<u}K(D-{CU`Y3L9_d{h0sCMQr_JlBCKDoq^MSp&u%B?4e7vYgK3OI zD_v}|B%H@Te!BRlR0|9!JE!;H`6a|K=|J<vR)iOAYF#c`Dw1_bp>>EC6zg^T>JeU9 zo^v}4-ATDpHRGe_H~ZB^oE#rfVf`S*#l`)D{UhERBaR9+C(`0$4nIr*k>4D#s#dMD zL7w|4vqk>)K0j}i;UN>_D+`0d&J<f-*H)I%dCYMasLuVga~nJ*V1ik?0m1jAv+nPg z!$T9~S+6OJt$^TUZB^J_m@cSjbcF;Uzoh;BeOBV7wgTJ*tIg>2oVa4qlBnvdFn3%! zG1^@Ro?ceq-|IWC_#z^&@}iy}SGjx?C|KjrDpyA#68%Lk?K+a<a}JDQ#pmPHNkB)R zoKl5LkNUk=l)7^+ISPXM?kA!6%_BTORHBp!g0UF##0`ELH*B$Aeed>79!?dd*elFs rU+RSVZe$*waPHN$lj6Cjy-qG9@Eq!t^pzO^tb<-WSCP$^HuC!~^vO!< literal 0 HcmV?d00001 diff --git a/docs/images/family.png b/docs/images/family.png new file mode 100644 index 0000000000000000000000000000000000000000..6f65fd62a50de225e484ac5797dbefc7cc5c42ba GIT binary patch literal 3374 zcmaKvcTiKy9)J&sA}CxN0TIwk5g~L9RRYpN5ot*XgeF~z0i;T`aHRwg&>$c+)FgnR zNE5Jx-n#??Dk203C|$tt;=FnD-d}HL_MF{0d$!H~zHc_({1%LdTaX(703IVlJxc&! z4`7uoj<d6#Q_G+3v0iNVEMYo8<$w^KRpIcsVR{1q$SEfdZXadUx%>=mSdDl;{K;&c zm@-!YIQhXy?*=^7fk89%x!@+!`BTWm##73N%QwBmf28QnsA|Qy;ONs=CU=@?gkmuF z%6nzE*m`p~LFSn`SGD|#`(OIx+I*oV%g5S9Bb5`SL2}O{KI)3geaGqYs_iY}Q)q{w zBGXp~-%wmq(i@mjo4{P=g0H!TmeyQ-@)H2KBu<f59-~sJpFVx+>+7rd>+a2$ai+6O z)a!+Xg^gct2y8$F7S(QW<s5ff$?yYau17FUeM04IVqc5G(-wj3q@CXFtzpB30m=EY zZ{B1S+!x3{dYb4d7vJ639KzYWZJ71lA)NUoyegDWP5Kvgv@x7Xj4tZ{hP>hs*M_N7 z+lbIb<cbq>sR2~zpzr0N6{P@G>hrw~RK%h5Yg}ulJO`nNd<1Ko)(9o)bWZO)+z}WO zW&IoLx}<l=e6OK3x?a64+B*@idpeCz+xu_iY3SU{nl^@^64lZ}MZ5fb7qxoqi09uF zX&s~tXzqjV7HvNWx6=NR68~aJ5O{svneXrH=I|ZlN<J<*=~?$MGd6n0s^!Sr2?LVo z&1yJ<{)x8BaP&@{DKdi&ayuQl7FEs~q-09I^#xQhf8Kd+e$Uf2D#{^=4KTf`si~=` znA-0?KKD5e@mLC~^d{n05h!6G?flZK^XestA?~VI>>m|6IL{j|ov?Nevd=8C+c_(> zRc1jf*AuO?je3>UU6dBD2ZJf$gKbFeX#o@gI}NX8mlHN<^m3Sc1}?6$J#KufaLhKL zJ3}LnYH{V<m?1Fa8uVm&0*mNQvdp~_@0zZwmo}<WDn6@|Fg{}F)%<?Z;UcXIUKawH ze~}wF2cl&A+`fG~K)g_*(3?w;XgMRWYHw!;7h`+-Pnnoq{fgJPpimk(yIK8&ERr@i zB#ZQY*>5)&R?{Dcs&U?$Ah$L)szJ^GKKa^T1g|4y!A8r{)lC|i<h#=;Q~bGUJjM2R zchr52M1|oGVGv^kCKZ<=Ku1%pHYks$a*FwjM_LqR!%6pFCht(BixTdYlBaz!vBL#8 zLax0pVR_9iJNoBS(38sIWK>Sljv4DTCUF24Dm(mm1c_(tafyv~KNuFM#sl<2znsek z2d>z;i4_^)vay<rr;9n#$uj#ZL0IwXTE9Hh^Il+lrdZx3`TG(4s(LBjwC}yDSB1TM z9tlydh1cEss8dbz4KW>|*Zz7UX2-c5DEB5%FHv{0u*FR(%%SSD%t*~<l>vK<>6s*h zdf(}Z$;r~nQeHL}#5&BL3rv~}R`Y?9d`Ode0r>T<rV94<Z(ULzyf(+KO%WSR`*gOc z>SKHI!j*T4HVBmZCa>Y6m+8wn=tE@j!tnv_B#Kvo`BM*cL31F}ZUafYO70pbT8|q7 zug+s<ljIts4_ljZ)j3iSvl*Lks1Yw*?ibVaz<FE)@={G4|B>j8u)FMDkc@1A1WyGA z-0JHIC45$X6AgZ3q3er-oFSTyj7=hcElS6jif4LNBHeTu>!)_>5Jr4e;V&hKXY8n7 zd#a33WP$`fH~qbvGhgzOQp}|3=b&4ik%0dF0FBiN<82AcrD*LA2_4NQDm*bU5p#0K z%YV^!DQ?_Emy@+?f?R;IG2?+3Hxnn(oxh$PrY`Oz#3gomz6(gXY~b+R@b`MK6c`Kb zsr^w_YayeHfcgK{OWvn!qMPOgJ94b=r9AfR5va`~RhG_OB}<pP(yHpovPO|+Fxx$u zEEOYY-r6Tt{5+|Y@FcA_B7h6>p7~iztmwZ~q&oIBY`N?w8ut)aywN$3oM-6*Xs3_! zmtA%a!mDA-IKMY|v;;k7Za~~Kh2mvoWXcqQ{5t`ScC-gxqOACJKX};RlP#~eFLv;d zCx++J;OAvt_*rto)7Vz0`F>--_BgBDT^%5*EI0usnedzC3Wwha;sMYi<b)sd8^3m) z4q0@uH8>_aqFcKLV1Q#oI;@GcudfHZ!9<I7d%Y>5)?nP+^tX-!6)`N9eG5>tshJ2- zQ4LoFX<gSYVfR#{NN065T)3`uUF}SH<dif-o=5nF>gl-|`52@gsgMo=fsQrr*k4SN z$=TU=FW#Ig<M122H@M#F2vj8gfifs@V`Iak(~J>uK(0Bm@8NvfJ9BY4?RUn&%kLT& zfm(HEz6%8ND>AaO=i7o@SXgSDKk<23o5T*B5_IMRVunr;0pRgJsH4E8YZPe!DEJ%6 z1{~)ha|7C*aR>m=(fz+o?F-CND3n69y(BdFAf(%9>P1eDy^W0p1bBOd%ndin%5C|v zZWeq!c-@*NPx}a-r>Z>ScfarIa=j6QnH>#p3W?tAhC}nLd4RXcsG}$8fqO&4P@_?m zwxz?39<C~-EvIjN@WC4U=90V7T^I_xpD1#8HKG0MGR85vb!01QFODUR`HhP%3(Qkf zvxjza8CETTHWxYJ^=0tDS(jmO^u>{fHMoHNXgp^M<M--52H^;3lL~W;N_bE1w1&6k z-h?E|pxrV}s@cmfA%|N#%p@<b2~VUcd8WDw-*5E}3$qF0&TnA}&1#JnvGYFXk*&dm zb%_X8C|N%=TmiU2Diod%Xw3c4To>q5^zyKFr=x$F5CZsOQTiI{;a}Vi{~F<t%{vs( z@M}n4O9X7~S&Bq&v6d06<4DMwA8*@Y?$uWj6@l6kI-MRLAMc|~6yb!C3K<cb-D8>M zBC_Wg^NWqcy!`lm3>`w8ANZ>?gfTO`Yh@2)n<ydD>Q?<Ekdx1idbX~mTBZorWf_ZG z5|?h++=+8F(6mHab?eb>XHpHR=!WeFS;DFxgErb=b>^GW7)SbIgHk?YQ~JZ)J`RT) zQvhsjXkVHjE{K2+C(osefD6)58~x=sl}ISrq@vfo-+a=geszL~O0J^C+XB;j7BFtS z@~;SHInB(|f6<D)eW}r`S!?%4B;-uYgf*<;?$kH|qKXZgE~y;QNkn9*Uekf#nT&2l zw)#*5*>7td1-l}$yphKFs7OX{7tva-EETve%^vIh164;7uON0Ut-5wJ`D(d4h8inB z3og&jdF@0#`ZUnI8!>*RPTImn8GO;d&3j2j@piBWUB5gKbF(+sOQdv8lgwRS$dJj) zJeZV37Q=p*)quxb{rwfUd++{xyq4{Lr-+pXL9Vy>;{Q5DJWi7vY<(DD_e?o5Ti|E9 zVlq1GxSDynhnA=@*JT%*?WtvfVfQ;<pk(O`HbRSuV~0>brvWYK7A*TktpAwpv{I$d zR5GezVE2n|cW@PGIn7h?(66@O-Me@Aw%u~j6R3na>6WHISVX5XYl~nO*92*;k>MdB z^?x9bMKn?}K+d2E?{Enr8L2O`l&std->doOV7I1pN1e_OxmJBuRy;A~y==bR7TC~K z;f}aXA5v2Ut4Z$XpqGufJ<xOX2e1^DQ=oYn9%u%=W)PZ~>pfxWWK$t>Uf5iWE%e)` z=8(0qa;wP5NXO{kb^q%Yf&Xy}U4rG7W(j<xGib>(7VVPZE4e@+Vb5);N_8H@Dn6Th zUr$E)daUz5nnbd3Jnx;Cvu_eN84pyi2o5`bKqagdJCKb1?to?5F5hk^;IP{;3AwXG zKe&8*6}5oI;jj?+iPOADGG*>QNw60_z5Mz<E<EI@<D0Vr+L!7$2~xXgoH$z#<~#jq zjK4UR<FVK&%`Aa1gy>f9bTLU`@5<<V{D=YhBtp1-yQ55LC!Ss(*bBkhUEML9DaPI) zzWaV(9eS3SW<2owISywv9$tfW5bcZv_5WyJK(dXA{#PJ@NgiWm|6ptgr9Wg%-iqN{ zwIQd87y84()fH@9?j31hi;z?R<iTKY5GNs?70+M!eSn6noSX^`b5n{m)nf4kG77^N z!}^qcf9-oS|Ekc~2)XqSwESe!1{V;M09AmTunmb)R}5Qwg-gBByP(zaPwtwng99>$ z-4ny=!@9s+Kwy=1AoFq0>M}I6gf5EA?$CB-2_kH@n$CQ_rfFO4qd$A236eIYEa(^s z?e0V~i}%<8XFeAE)4OMd64w5hBXKP6u(iH48uK3latl;X`9!RQZa%M^Y{eRSd8ye- zt(B%=O@o7iHGgNcF;g*7z-K)YJAwt>aWH@GN3uPrYOXty#c8xuT0?Vlu!uTUMMcH> z$~pKE;FTDXjlViHhn2`rDfVcz)f2Wqj0dz0MW6>-(To+<6A!gDS$7=3NdJ~zrH<3X Fe*u?Qd;kCd literal 0 HcmV?d00001 diff --git a/docs/images/schemas.vsdx b/docs/images/schemas.vsdx index a799ef7d8bc7a7119c6cdfb33219d806720b966f..00a0d60a28eef6444230cb5ed7e55084b3e58eda 100644 GIT binary patch delta 24994 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 delta 20335 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�%f;FF~nkEWK=SynbRpi5|)0d}(dWKB*z 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 Pf^d&<f;7yie|rB14irFe diff --git a/docs/images/zelda_sword.png b/docs/images/zelda_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..84296dc11f1cb17b4f6afda148497dbcf10e8060 GIT binary patch literal 8580 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 V+Q+Io9(e$OiQ$E_rDt5@{s#c?$5Q|R literal 0 HcmV?d00001 diff --git a/test/autodispose.dart b/test/autodispose.dart new file mode 100644 index 0000000..3213ad2 --- /dev/null +++ b/test/autodispose.dart @@ -0,0 +1,27 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('doit vérifier que les ressources du Provider sont libérées', () async { + // given: + final container = ProviderContainer(); + addTearDown(container.dispose); + + var disposed = false; // 1 + final provider = Provider.autoDispose<void>((ref) { + ref.onDispose(() => disposed = true); + }); + + // when: + container.read(provider); // <2> + + // then: + expect(disposed, isFalse); // <3> + + // when: + await Future.delayed(const Duration(milliseconds: 1)); // <4> + + // then: + expect(disposed, isTrue); // <5> + }); +} diff --git a/test/circle_of_life.dart b/test/circle_of_life.dart new file mode 100644 index 0000000..180bcd2 --- /dev/null +++ b/test/circle_of_life.dart @@ -0,0 +1,37 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('doit vérifier le cycle de vie du Provider', () { + const defaultValue = -1; + + // given: + final container = ProviderContainer(); + addTearDown(container.dispose); + + var intValue = defaultValue; // <1> + var disposed = false; + + final intProvider = Provider.autoDispose<int>((ref) { + ref.onDispose(() => disposed = true); + return intValue = 13; + }); + + // expect: + expect(intValue, equals(defaultValue)); // <2> + expect(disposed, isFalse); + + // when: + container.read(intProvider); // <3> + + // then: + expect(intValue, equals(13)); // <4> + expect(disposed, isFalse); + + // when: + container.dispose(); // <5> + + // then: + expect(disposed, isTrue); // <6> + }); +} diff --git a/test/dependance_cyclique.dart b/test/circular_dependency.dart similarity index 88% rename from test/dependance_cyclique.dart rename to test/circular_dependency.dart index abe30b7..d31408d 100644 --- a/test/dependance_cyclique.dart +++ b/test/circular_dependency.dart @@ -9,7 +9,7 @@ final Provider<int> provider = Provider<int>((ref) => ref.watch(otherProvider)); final Provider<int> otherProvider = Provider<int>((ref) => ref.watch(provider)); void main() { - test('doit lever une exception suite à une dépendance cyclique', () { + test('doit lever une exception suite à une dépendance circulaire', () { // given: final container = createContainer(); diff --git a/test/family.dart b/test/family.dart new file mode 100644 index 0000000..b0e0be1 --- /dev/null +++ b/test/family.dart @@ -0,0 +1,17 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'utils.dart'; + +final evenProvider = StateProvider.family<bool, int>((_, arg) => arg.isEven); // <1> + +void main() { + test('doit distinguer chaque état dans un provider', () { + // given: + final container = createContainer(); + + // then: + expect(container.read(evenProvider(13)), isFalse); // <2> + expect(container.read(evenProvider(42)), isTrue); + }); +} \ No newline at end of file diff --git a/test/test_overrides.dart b/test/overrides.dart similarity index 100% rename from test/test_overrides.dart rename to test/overrides.dart -- GitLab