Fiche 02.03 — @Binding en SwiftUI
Objectif
Comprendre à quoi sert @Binding, comment il permet à une sous-vue de lire et modifier une valeur appartenant à une vue parente, et pourquoi il est souvent utilisé avec @State.
1. L’idée à comprendre
@State stocke une valeur dans une vue.
@Binding permet à une autre vue de modifier cette valeur sans en devenir propriétaire.
Schéma simple :
La vue parent garde la vraie donnée.
La sous-vue reçoit seulement un lien vers cette donnée.
2. Code minimal
Ici :
ParentViewpossède la donnée avec@State;ToggleRowViewreçoit un@Binding;- quand le toggle change,
isOnest modifié dans le parent ; - SwiftUI met à jour l’interface.
3. Pourquoi utiliser @Binding ?
Sans @Binding, une sous-vue ne peut pas modifier proprement une valeur appartenant à son parent.
Exemple : tu as un écran parent avec une valeur :
Tu veux créer une sous-vue réutilisable pour éditer ce nom.
La sous-vue ne doit pas créer son propre @State, sinon elle aurait une copie séparée.
Elle doit recevoir un @Binding.
4. Exemple avec un champ de texte réutilisable
Ici, UsernameField est réutilisable.
Il ne possède pas le nom.
Il reçoit simplement un lien vers le nom du parent.
5. Valeur normale vs Binding
Quand tu passes une valeur normale :
La sous-vue peut seulement lire la valeur.
Quand tu passes un binding :
La sous-vue peut lire et modifier la valeur.
À retenir :
6. Exemple avec une sheet
@Binding est très utile pour fermer une sheet depuis son contenu.
Ici, la sheet est contrôlée par isShowingSheet dans le parent.
La sous-vue peut la fermer grâce au binding.
7. Exemple avec un composant custom
Tu peux créer un composant qui modifie une valeur externe.
Utilisation :
FavoriteButton ne stocke pas lui-même l’état favori.
Il modifie l’état fourni par son parent.
8. Exemple avec un formulaire
Un formulaire est souvent composé de plusieurs sous-vues avec des bindings.
Chaque sous-vue reste simple, mais toutes modifient les valeurs du formulaire parent.
9. @Binding ne crée pas la donnée
Une variable @Binding doit recevoir une donnée depuis l’extérieur.
Cette vue ne peut pas fonctionner seule :
Elle doit être appelée avec :
Donc @Binding signifie :
10. Preview avec @Binding
Une vue avec @Binding a besoin d’une valeur dans sa preview.
Le plus simple : utiliser .constant(...).
.constant(true) crée un binding fixe pour la preview.
C’est pratique pour visualiser la vue.
Mais attention : comme la valeur est constante, elle ne changera pas vraiment dans la preview.
Pour une preview interactive, tu peux créer une petite vue wrapper :
Ici, le bouton peut vraiment modifier l’état dans la preview.
11. Quand utiliser @Binding
Utilise @Binding quand :
- une sous-vue doit modifier une valeur du parent ;
- tu crées un composant de formulaire ;
- tu crées un bouton custom qui modifie un état externe ;
- tu veux fermer une sheet depuis son contenu ;
- tu veux réutiliser un composant sans qu’il possède lui-même la donnée.
Exemples :
12. Quand ne pas utiliser @Binding
N’utilise pas @Binding si la sous-vue n’a besoin que de lire la valeur.
Dans ce cas, passe une valeur normale.
Exemple :
Ici, pas besoin de @Binding, car la vue ne modifie pas username.
13. @Binding vs callback
Pour une action simple, tu peux parfois utiliser une closure au lieu d’un binding.
Avec binding :
Avec callback :
Utilise plutôt @Binding quand le composant modifie directement une valeur simple.
Utilise plutôt une closure quand le parent doit décider quoi faire exactement.
Exemple :
Dans une vraie app avec API ou ViewModel, la closure est parfois plus propre, car l’action peut déclencher une logique plus complexe.
14. Points à connaître
@Binding crée un lien, pas une copie
Si la sous-vue modifie le binding, la valeur du parent change aussi.
Le parent garde la source de vérité
La vraie donnée reste dans le parent.
La sous-vue ne fait que manipuler cette donnée via un lien.
N’utilise pas @Binding partout
Si une vue doit seulement afficher une donnée, passe un let.
Si une vue doit modifier une donnée simple du parent, utilise @Binding.
Si une vue déclenche une action complexe, utilise plutôt une closure ou un ViewModel.
Résumé
À retenir :
@Bindingpermet à une sous-vue de modifier une valeur détenue par son parent ;- le parent possède souvent la valeur avec
@State; - la sous-vue reçoit cette valeur avec
@Binding; - on passe un binding avec
$variable; variabledonne la valeur,$variabledonne un lien modifiable ;@Bindingest très utile pour les formulaires, sheets, toggles et composants réutilisables ;- si une sous-vue ne fait que lire une valeur, utili