Fiche 02.02 — @State en SwiftUI
Objectif
Comprendre à quoi sert @State, quand l’utiliser, et comment il permet à une vue SwiftUI de se mettre à jour quand une valeur locale change.
1. L’idée à comprendre
@State sert à stocker une donnée locale dans une vue SwiftUI.
Quand cette donnée change, SwiftUI relit le body de la vue et met à jour l’interface.
Exemple simple :
Ici, isOn est une valeur qui appartient à la vue.
Si isOn change, la vue peut se mettre à jour automatiquement.
2. Code minimal
Ce qu’il se passe :
3. Quand utiliser @State
Utilise @State pour une donnée simple qui appartient uniquement à la vue actuelle.
Exemples fréquents :
@State est adapté pour :
- afficher ou cacher une sheet ;
- gérer un champ de texte ;
- activer/désactiver un toggle ;
- stocker un filtre sélectionné ;
- gérer un état visuel local ;
- déclencher un changement d’interface dans une seule vue.
4. @State doit souvent être private
En général, une variable @State appartient à la vue.
Donc on l’écrit souvent comme ça :
Le private indique que l’état est interne à la vue.
Une autre vue ne devrait pas venir modifier directement cette variable.
Si une sous-vue doit modifier cette valeur, on utilisera plutôt @Binding, qui sera vu dans la fiche suivante.
5. Exemple avec un champ de texte
@State est très utilisé avec TextField.
Ici :
usernamecontient le texte actuel ;- le
TextFieldmodifieusername; - le
Textse met à jour automatiquement.
Le $username est important : il permet au TextField de lire et modifier la valeur.
6. Exemple avec une sheet
@State est souvent utilisé pour afficher ou cacher une sheet.
Ici :
- quand
isShowingSheet == false, la sheet est cachée ; - quand
isShowingSheet == true, la sheet apparaît ; - SwiftUI gère l’affichage automatiquement.
7. Exemple avec un état visuel
Ici, @State permet de choisir entre un TextField et un SecureField.
8. @State et les types simples
@State est parfait pour les types simples :
Il peut aussi stocker des tableaux ou des structs simples :
Exemple :
9. Quand ne pas utiliser @State
@State n’est pas fait pour tout.
Évite @State si la donnée :
- doit être partagée entre plusieurs écrans ;
- vient d’un service global ;
- représente une session utilisateur complète ;
- contient beaucoup de logique métier ;
- doit survivre durablement après fermeture de l’app ;
- doit être testée dans un ViewModel ;
- doit être utilisée par plusieurs vues indépendantes.
Dans ces cas, tu utiliseras plutôt :
10. Différence entre valeur normale et @State
Une propriété normale ne permet pas à la vue de se mettre à jour quand elle change.
Pas correct :
Correct :
@State dit à SwiftUI :
11. Le signe $
Quand tu écris :
Tu ne passes pas simplement la valeur de username.
Tu passes un Binding, c’est-à-dire un lien en lecture/écriture vers cette valeur.
Exemple :
Le TextField a besoin de modifier le texte.
Il ne peut donc pas recevoir seulement :
Il doit recevoir :
À retenir :
12. @State avec un modèle simple
Tu peux utiliser @State avec une struct.
Ici, @State stocke tout le profil localement dans la vue.
C’est adapté si c’est un formulaire local temporaire.
Pour un vrai profil utilisateur venant d’une API ou de Firebase, on utilisera plutôt un ViewModel.
13. Points à connaître
@State appartient à la vue qui le déclare
Une sous-vue ne devrait pas modifier directement le @State d’un parent.
Pour ça, on passe un Binding.
@State est stocké par SwiftUI
Même si la View est une struct et peut être recréée, SwiftUI conserve la valeur de @State tant que la vue reste à la même place dans la hiérarchie.
C’est pour ça que ton compteur ne revient pas à zéro à chaque mise à jour du body.
@State ne remplace pas un ViewModel
Si tu commences à avoir beaucoup de logique dans la vue, c’est probablement que la donnée doit aller dans un ViewModel.
Exemple :
Résumé
À retenir :
@Statestocke une donnée locale à une vue ;- quand un
@Statechange, SwiftUI met à jour l’interface ; @Stateest idéal pour les valeurs simples et locales ;- on écrit souvent
@State private var ...; $variablecrée unBindingmodifiable ;@Statene doit pas servir à stocker toute la logique métier ;- pour partager ou structurer des données plus complexes, on utilisera
@Binding,@StateObject,@ObservedObjectou@EnvironmentObject.