DEV Community

GoyesDev
GoyesDev

Posted on

SwiftUI #24: Ambiente ("Environment")

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 usar preferredColorScheme(_:), 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
        )
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

El útil cambiar los valores del ambiente en el Preview:

#Preview {
  ContentView()
    .environment(\.colorScheme, .light)
}
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode
struct ContentView: View {

  @Environment(\.newEnvValue) var colorScheme

  var body: some View {
    VStack {
      Text("Hola mundo")
        .background(
          colorScheme == "Hola" ? Color.blue : Color.red
        )
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
#Preview {
  ContentView()
    .environment(\.newEnvValue, "Otro valor")
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)