@Environment in SwiftUI — property wrapper voor het lezen van waarden uit de systeemomgeving, automatisch verspreid door de View-hiërarchie. De component biedt toegang tot kleurenschema, locale, lettergrootte, managedObjectContext en tientallen andere systeemparameters. Volgens Apple Developer Documentation (2025) garandeert @Environment dat elke wijziging van een omgevingswaarde het hertekenen van alle geabonneerde Views veroorzaakt, wat zorgt voor reactieve interface-updates zonder handmatige aanroepen.
Belangrijkste punten
@Environment — is een SwiftUI property wrapper bedoeld voor het lezen van waarden uit de systeemomgeving. De omgeving is een hiërarchische container van waarden die SwiftUI automatisch verspreidt van parent-Views naar child-Views. Elke omgevingswaarde wordt geïdentificeerd door een sleutel — een type dat voldoet aan het EnvironmentKey-protocol.
Het omgevingsmechanisme doet denken aan dependency injection op framework-niveau: het systeem biedt een vooraf gedefinieerde set waarden — kleurenschema (licht/donker), locale, lettergrootte, managedObjectContext voor Core Data, dismiss voor het sluiten van een scherm en vele andere. Een View die @Environment met een specifieke sleutel heeft gedeclareerd, ontvangt automatisch de huidige waarde en wordt hertekend wanneer deze verandert.
De architectuur van de SwiftUI-omgeving is gebaseerd op het EnvironmentValues-protocol — een structuur die alle systeemwaarden bevat. Elke waarde wordt opgeslagen als een eigenschap van deze structuur met getter en setter. @Environment gebruikt key path om toegang te krijgen tot een specifieke eigenschap: @Environment(\.colorScheme) — toegang tot kleurenschema, @Environment(\.locale) — tot locale.
Property wrapper @Environment implementeert twee belangrijke mechanismen: het lezen van waarden uit de omgeving en abonneren op veranderingen ervan. Bij het maken van een View doorloopt SwiftUI alle @Environment-eigenschappen en koppelt ze aan de overeenkomstige waarden uit de huidige context. Als een parent-View de waarde wijzigt via de .environment()-modifier, worden alle child-Views die deze waarde lezen automatisch hertekend.
Een belangrijke eigenschap: @Environment ondersteunt optionele waarden. Als een waarde niet is ingesteld in de hiërarchie, wordt de standaardwaarde gedefinieerd in EnvironmentKey geretourneerd. Voor systeemsleutels is de standaardwaarde altijd redelijk — bijvoorbeeld het standaard kleurenschema .light. Voor aangepaste sleutels bepaalt de ontwikkelaar zelf de standaardwaarde in de defaultValue-methode van het EnvironmentKey-protocol.
struct EnvironmentReaderView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.locale) var locale
@Environment(\.sizeCategory) var sizeCategory
var body: some View {
VStack {
Text("Huidig schema: \(colorScheme == .dark ? "Dark" : "Light")")
Text("Locale: \(locale.identifier)")
Text("Lettergrootte: \(sizeCategory)")
}
}
}
In het voorbeeld leest een View drie systeemomgevingswaarden. Bij wijziging van colorScheme — bijvoorbeeld de gebruiker heeft donkere modus ingeschakeld in instellingen — wordt de View automatisch hertekend met de nieuwe waarde. Hetzelfde bij wijziging van regio of lettergrootte (Dynamic Type). De View hoeft zich niet te abonneren op meldingen of verversen aan te roepen — SwiftUI beheert dit automatisch.
SwiftUI biedt tientallen systeemomgevingswaarden die verschillende aspecten van interface en gedrag dekken. Kleurenschema (\.colorScheme) — een van de meest gevraagde waarden, waarmee de interface kan worden aangepast aan lichte en donkere thema’s. Locale (\.locale) bevat de regionale instellingen van de gebruiker voor het formatteren van datums, getallen en valuta.
Voor Core Data wordt managedObjectContext (\.managedObjectContext) gebruikt — de context die via de omgeving uit de persistence container wordt doorgegeven. Voor navigatie zijn dismiss (\.dismiss) voor het sluiten van het huidige scherm en isPresented (\.isPresented) voor modale weergaven beschikbaar. Voor kalender en tijdzone — respectievelijk calendar en timeZone.
| Key Path | Type | Doel |
|---|---|---|
| \.colorScheme | ColorScheme | Licht of donker thema |
| \.locale | Locale | Regionale instellingen |
| \.sizeCategory | ContentSizeCategory | Dynamic Type lettergrootte |
| \.managedObjectContext | NSManagedObjectContext | Core Data context |
| \.dismiss | DismissAction | Scherm sluiten |
| \.calendar | Calendar | Huidige kalender |
| \.timeZone | TimeZone | Tijdzone |
| \.horizontalSizeClass | UserInterfaceSizeClass | Horizontale schermgrootte |
Gebruik key path met een punt om toegang te krijgen tot systeemwaarden: @Environment(\.dismiss) var dismiss. De compiler controleert het bestaan van de key path in EnvironmentValues, dus een verkeerde sleutel veroorzaakt een fout tijdens het compileren. Nieuwe systeemwaarden worden door Apple toegevoegd met elke iOS-versie — de actuele lijst is beschikbaar in de EnvironmentValues-documentatie.
Ondanks de vergelijkbare namen lossen @Environment en @EnvironmentObject verschillende taken op. @Environment leest systeem- of aangepaste waarden die via EnvironmentKey zijn geregistreerd. @EnvironmentObject — is een property wrapper voor ObservableObject, doorgegeven via de omgeving op type, zonder expliciete sleutel.
@EnvironmentObject wordt gebruikt voor dependency injection: een parent-View maakt een object aan (bijvoorbeeld ViewModel) en geeft het door aan child-Views via de .environmentObject()-modifier. Child-Views ontvangen het via @EnvironmentObject en kunnen zowel de eigenschappen lezen als wijzigen. @Environment daarentegen — alleen-lezen voor systeemwaarden en ondersteunt geen terugkoppeling.
| Parameter | @Environment | @EnvironmentObject |
|---|---|---|
| Doel | Systeem- en aangepaste waarden | ObservableObject injectie |
| Sleutel | Key path EnvironmentValues | Op objecttype |
| Schrijven | Alleen lezen | Lezen en schrijven |
| Aangepaste waarde | Via EnvironmentKey | Via ObservableObject klasse |
| Standaardwaarde | Ja (defaultValue) | Nee (moet worden doorgegeven) |
In de praktijk: gebruik @Environment voor toegang tot systeemparameters (thema, locale, lettergrootte) en aangepaste configuraties die niet veranderen tijdens runtime. Gebruik @EnvironmentObject voor het doorgeven van ViewModel of service via de View-hiërarchie wanneer de status moet worden gewijzigd vanuit child-componenten.
Laten we het maken van een aangepaste omgevingswaarde bekijken. Hiervoor moet je een structuur definiëren die voldoet aan het EnvironmentKey-protocol en EnvironmentValues uitbreiden met een nieuwe eigenschap. Dit maakt het mogelijk om themaconfiguratie of app-instellingen door de hele View-boom te verspreiden zonder props.
struct AppThemeKey: EnvironmentKey {
static let defaultValue: AppTheme = .system
}
extension EnvironmentValues {
var appTheme: AppTheme {
get { self[AppThemeKey.self] }
set { self[AppThemeKey.self] = newValue }
}
}
enum AppTheme { case system, light, dark }
Het EnvironmentKey-protocol vereist implementatie van de statische eigenschap defaultValue — de waarde die wordt gebruikt als de parent-View geen aangepaste omgeving heeft ingesteld. De EnvironmentValues-uitbreiding voegt de berekende eigenschap appTheme toe, met behulp van subscript met de sleutel. Hierna kan elke View de waarde lezen via @Environment(\.appTheme).
struct ThemedView: View {
@Environment(\.appTheme) var appTheme
@Environment(\.colorScheme) var colorScheme
var body: some View {
VStack {
if appTheme == .dark || (appTheme == .system && colorScheme == .dark) {
Text("Donkere modus actief")
.foregroundStyle(.white)
.background(Color.black)
} else {
Text("Lichte modus actief")
.foregroundStyle(.black)
.background(Color.white)
}
}
}
}
struct ContentView: View {
@State private var selectedTheme = AppTheme.system
var body: some View {
ThemedView()
.environment(\.appTheme, selectedTheme)
}
}
ThemedView leest twee omgevingen: aangepaste appTheme en systeem colorScheme. De combinatie maakt het mogelijk een flexibele thema-instelling te implementeren: de gebruiker kan kiezen voor “Licht”, “Donker” of “Systeem”-thema. Als systeem is geselecteerd — wordt de waarde gehaald uit colorScheme, dat automatisch verandert bij het wisselen van thema in iOS-instellingen. De parent-View (ContentView) stelt de appTheme-waarde in via de .environment()-modifier.
struct ModalView: View {
@Environment(\.dismiss) var dismiss
@State private var name = ""
var body: some View {
NavigationStack {
Form {
TextField("Your name", text: $name)
Button("Opslaan") { dismiss() }
}
.navigationTitle("Edit Profile")
}
}
}
Dit voorbeeld demonstreert het praktische gebruik van dismiss — een DismissAction-instantie uit de omgeving. Het aanroepen van dismiss() als functie sluit het modale scherm of keert terug van een NavigationLink. De enige vereiste is dat de View modaal moet worden gepresenteerd of zich in een NavigationStack moet bevinden. dismiss wordt automatisch bepaald uit de context: als de View als sheet is geopend — wordt de sheet gesloten, als popover — wordt de popover gesloten.
Veelgestelde vragen
Nee, @Environment is alleen bedoeld voor lezen. Gebruik @EnvironmentObject met ObservableObject of @Binding om waarden te wijzigen. Aangepaste EnvironmentKeys kunnen een setter hebben in een extensie, maar wijziging via deze setter activeert geen UI-update — dit is technisch mogelijk, maar wordt niet aanbevolen.
@Binding creëert een bidirectionele verbinding met de bron van waarheid (State, StateObject, ObservableObject). @Environment — eenrichtingslezing uit de hiërarchische context. @Binding is geschikt voor het doorgeven van gegevens aan een child-View, @Environment — voor toegang tot systeem- of globale instellingen.
Definieer een structuur die het EnvironmentKey-protocol implementeert met static defaultValue. Breid vervolgens EnvironmentValues uit met een eigenschap met getter/setter via subscript[key]. Gebruik na registratie @Environment(\.yourKey) voor lezen en .environment(\.yourKey, value) voor instellen.
SwiftUI biedt meer dan 50 systeemwaarden: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight en andere. De volledige lijst staat in de EnvironmentValues-documentatie.
Ja, @Environment werkt in Preview, maar standaardwaarden kunnen afwijken van de simulator. Gebruik voor testen in Preview de .environment()-modifier direct in de Preview-code: ThemedView().environment(\.colorScheme, .dark). Dit maakt het mogelijk verschillende omgevingstoestanden visueel te controleren.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook