El "environment" es una estructura de datos que puede almacenar y propagar valores dentro de una jerarquía de vistas. Es como un contenedor de dependencias para inyección de dependencias.
EnvironmentValues
Estructura definida para almacenar los valores de ambiente
Algunas de las propiedades de ambiente del sistema son:
-
colorScheme: Configura el esquema de color de las subvistas (es mejor usarpreferredColorScheme(_:), pues aplica también para el contenedor). -
dynamicTypeSize: COnfigura el tamaño dinámico del contenido. -
accessibilityEnabled: Indica si el usuario activó algún servicio de accesibilidad. -
calendar: Retorna el calendario usado por las vistas para procesar fechas. -
locale: Configura y retorna el "locale" usado por las vistas para procesar datos, como lenguaje y moneda. -
timeZone: retorna la zona horaria usada por las vistas para calcular fechas y horas.
Se pueden modificar los valores de EnvironmentValues con los modificadores:
-
environment(_:_:): Permite cambiar el valor de una de las propiedades del ambiente. El primer argumento es el "key path" de la propiedad que se quiere modificar. -
environment(_:): Asigna un objeto al ambiente.
@Environment
"Property-wrapper" definido para leer los valores de ambiente, especificando el "key path" de la propiedad que corresponda. Este "property-wrapper" también crea un binding entre la propiedad envuelta y la del "environment", para que cambiar de forma reactiva.
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
VStack {
Text("Hola mundo")
.background(
colorScheme == .dark ? Color.blue : Color.red
)
}
}
}
El útil cambiar los valores del ambiente en el Preview:
#Preview {
ContentView()
.environment(\.colorScheme, .light)
}
Valores personalizados de ambiente
Se puede agregar una extensión a EnvironmentValues y agregar una nueva propiedad con el macro @Entry.
extension EnvironmentValues {
@Entry var newEnvValue: String = "Hola"
}
struct ContentView: View {
@Environment(\.newEnvValue) var colorScheme
var body: some View {
VStack {
Text("Hola mundo")
.background(
colorScheme == "Hola" ? Color.blue : Color.red
)
}
}
}
#Preview {
ContentView()
.environment(\.newEnvValue, "Otro valor")
}

Top comments (0)