EnvironmentObject
nos permite inyectar a varias vistas la instancia de una clase - siempre que esta forme parte del protocolo ObservableObject
. De esta forma en vez de pasar el modelo de forma explícita en cada una de las vistas podemos agregar el @EnvironmentObject
.
Funciona entonces como un property wrapper una estructura que permite encapsular nuestra parte del código para que acceda así a las propiedades o métodos que tengamos albergados en nuestra clase.
De esta forma podríamos tener por ejemplo una vista formada por varios componentes e inyectarle a aquellos que lo necesiten la clase. Suele utilizarse para propiedades que se crean en algún lugar de nuestra app, pero se usarán en varios domo por ejemplo data compartida.
VStack() {
OneView()
.environmentObject(myModel)
AnotherView()
EvenOtherView()
.environmentObject(myModel)
}
El StateObject
es también un tipo property wrapper sin embargo en este caso, lo que hace es que inicializa la instancia de nuestra clase observada y la guarda para luego ser utilizada.
Para ello la clase instanciada debe también formar parte del protocolo ObservableObject
. En el caso que dicha clase tenga propiedades marcadas como @Published
el StateObject
se refrescará para mostrar los cambios del objeto.
@StateObject
tiene cierta responsabilidad cuando una vista usa el @StateObject
le estamos diciendo a Swift que ahí crearemos el objeto y que esa vista es la dueña de los datos y la responsable de darle vida. Cualquier otra vista que quiera hacer uso de ella deberá realizarlo utilizando @ObservedObject
struct WordleApp: App {
@StateObject var dataModel = WordleDataModel()
@StateObject var colorSchemeManager = ColorSchemeManager()
var body: some Scene {
WindowGroup {
GameView()
.environmentObject(dataModel)
.environmentObject(colorSchemeManager)
.onAppear {
colorSchemeManager.applyColorScheme()
}
}
}
}
https://www.youtube.com/watch?v=-yjKAb0Pj60
The difference between @StateObject, @EnvironmentObject, and @ObservedObject in SwiftUI