Inyección de objetos no observables en SwiftUI

Inyección de Objetos no observables

En SwiftUI, el modificador .environment() permite inyectar valores en el árbol de vistas, lo que hace que estas vistas y sus subcomponentes puedan acceder al valor inyectado. Aunque SwiftUI se utiliza principalmente con objetos que conforman el protocolo ObservableObject para sincronizar automáticamente los cambios, también puedes inyectar objetos que no sean observables.

A continuación, te explico cómo hacerlo:

Pasos para usar .environment() con un objeto no observable

1.Crear el valor u objeto a compartir: Define el objeto o valor que deseas compartir. No es necesario que este conforme a ObservableObject si no necesitas reactividad.

2.Definir una clave de entorno personalizada: Usa el protocolo EnvironmentKey para crear una clave que representará tu objeto en el entorno.

3.Extender EnvironmentValues: Asocia tu clave personalizada con una propiedad en EnvironmentValues.

4.Usar .environment(): Inyecta el objeto en el entorno utilizando la clave personalizada.

5.Acceder al objeto: Utiliza el decorador @Environment para obtener el objeto en las vistas que lo necesiten.

 

Ejemplo práctico: Inyectar un objeto no observable

Supongamos que deseas compartir un objeto UserSettings no observable entre tus vistas.

1. Crear el objeto a compartir

				
					struct UserSettings {
    let username: String
    let preferredTheme: String
}
				
			

2. Crear una clave de entorno personalizada

				
					import SwiftUI

struct UserSettingsKey: EnvironmentKey {
    static let defaultValue: UserSettings = UserSettings(username: "Guest", preferredTheme: "Light")
}
				
			

3. Extender EnvironmentValues

				
					extension EnvironmentValues {
    var userSettings: UserSettings {
        get { self[UserSettingsKey.self] }
        set { self[UserSettingsKey.self] = newValue }
    }
}
				
			

4. Inyectar el objeto en el entorno

En el punto donde configures tu vista principal, usa .environment() para inyectar una instancia personalizada de UserSettings:

				
					@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.userSettings, UserSettings(username: "Alice", preferredTheme: "Dark"))
        }
    }
}
				
			

5. Acceder al objeto en las vistas

Usa @Environment para obtener el valor de UserSettings en cualquier vista descendiente:

				
					struct ContentView: View {
    @Environment(\.userSettings) private var userSettings
    
    var body: some View {
        VStack {
            Text("Hello, \(userSettings.username)!")
            Text("Preferred Theme: \(userSettings.preferredTheme)")
        }
        .padding()
    }
}
				
			

Consideraciones

1.No reactividad: Si UserSettings cambia en tiempo de ejecución, las vistas no se actualizarán automáticamente porque no es un objeto observable. Si necesitas reactividad, considera usar ObservableObject junto con @StateObject o @EnvironmentObject.

2.Valores predeterminados: La clave de entorno debe proporcionar un valor predeterminado en caso de que no se inyecte explícitamente.

3.Uso de objetos ligeros: Evita inyectar objetos muy complejos o con gran carga computacional, ya que el entorno está diseñado para valores o dependencias relativamente simples.

Conclusión

El uso de .environment() con objetos no observables es útil para compartir configuraciones globales o dependencias estáticas. Con los pasos anteriores, puedes implementar este enfoque de manera limpia y escalable en tus proyectos SwiftUI.

Si te ha gustado el contenido puedes dejarme un comentario. Feliz codificación!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio