Fiche 02.07 — @Environment en SwiftUI
Objectif
Comprendre à quoi sert @Environment, comment récupérer des valeurs fournies par SwiftUI, et dans quels cas l’utiliser.
1. L’idée à comprendre
@Environment permet de lire une valeur disponible dans l’environnement SwiftUI.
Ces valeurs peuvent venir :
- du système ;
- de SwiftUI ;
- d’un parent ;
- d’une configuration injectée plus haut.
Exemples fréquents :
À retenir :
2. Différence entre @Environment et @EnvironmentObject
Les deux noms se ressemblent, mais ils ne servent pas à la même chose.
Ici, tu lis une valeur précise de l’environnement.
Ici, tu récupères un objet observable complet injecté avec .environmentObject(...).
Résumé :
3. Exemple avec dismiss
dismiss sert à fermer une vue présentée, par exemple une sheet.
Dans la sheet :
Ici, la sheet n’a pas besoin de recevoir un @Binding pour se fermer.
Elle utilise directement dismiss fourni par SwiftUI.
4. Exemple avec colorScheme
colorScheme permet de savoir si l’app est en light mode ou dark mode.
Tu peux t’en servir pour adapter une vue selon le thème actuel.
Exemple :
Mais dans beaucoup de cas, il vaut mieux utiliser des couleurs adaptatives plutôt que tester manuellement colorScheme partout.
5. Exemple avec dynamicTypeSize
dynamicTypeSize permet de connaître la taille de texte choisie par l’utilisateur dans les réglages d’accessibilité.
C’est utile pour adapter certains layouts quand le texte devient très grand.
6. Exemple avec horizontalSizeClass
horizontalSizeClass permet de savoir si l’espace horizontal est compact ou régulier.
Sur iPhone, c’est souvent compact.
Sur iPad, ça peut être régulier.
C’est utile pour adapter une interface selon la taille disponible.
7. Exemple avec openURL
openURL permet d’ouvrir une URL depuis SwiftUI.
Tu peux l’utiliser pour ouvrir :
- une page web ;
- un lien de support ;
- une page de conditions générales ;
- un lien vers les réglages si nécessaire avec une URL système adaptée.
8. Exemple avec scenePhase
scenePhase permet de connaître l’état de l’app : active, inactive ou en arrière-plan.
C’est utile pour :
- rafraîchir des données quand l’app revient au premier plan ;
- sauvegarder un état quand l’app passe en arrière-plan ;
- mettre en pause certaines opérations.
9. Injecter une valeur d’environnement
Certaines valeurs d’environnement peuvent être modifiées plus haut dans la hiérarchie.
Exemple avec le color scheme :
Exemple avec une locale :
Exemple pour une preview :
Cela permet de tester une vue dans différents contextes.
10. Quand utiliser @Environment
Utilise @Environment quand tu veux lire une information contextuelle.
Exemples :
Cas courants :
- fermer une sheet ;
- adapter une vue au dark mode ;
- détecter le retour au premier plan ;
- ouvrir une URL ;
- tester l’accessibilité ;
- adapter le layout à iPhone/iPad.
11. Quand ne pas utiliser @Environment
N’utilise pas @Environment pour stocker la logique métier de ton app.
Par exemple, pour une session utilisateur complète, préfère souvent :
ou un ViewModel selon le cas.
@Environment est plutôt fait pour lire des valeurs déjà présentes dans le contexte SwiftUI.
12. Points à connaître
@Environment est en lecture contextuelle
Tu lis une valeur fournie par SwiftUI ou injectée plus haut.
Tu ne crées pas la donnée dans la vue.
Certaines valeurs changent automatiquement
Par exemple :
colorSchemechange si l’utilisateur passe en dark mode ;scenePhasechange quand l’app passe en arrière-plan ;dynamicTypeSizedépend des réglages d’accessibilité.
SwiftUI peut mettre à jour la vue si ces valeurs changent.
Pour fermer une sheet, dismiss est souvent plus simple qu’un @Binding
Avec @Binding :
Avec dismiss :
Si la vue a juste besoin de se fermer elle-même, dismiss est souvent plus propre.
Résumé
À retenir :
@Environmentpermet de lire une valeur contextuelle fournie par SwiftUI ;@EnvironmentObjectsert à récupérer un objet observable partagé ;dismisspermet de fermer une vue présentée ;colorSchemepermet de connaître light/dark mode ;scenePhasepermet de savoir si l’app est active ou en arrière-plan ;openURLpermet d’ouvrir une URL ;dynamicTypeSizeaide à gérer l’accessibilité ;@Environmentest utile pour le contexte système, pas pour toute la logique métier de l’app.