부모, 혹은 그 상위 계층의 뷰로부터 전달받은 observable object를 위한 property wrapper
@EnvironmentObject로 선언된 property는 ObservableObject protocol을 준수해야합니다.
observable object가 변경될 때 현재의 뷰를 무효화시킵니다.
property를 envrionment object로 선언한다면 부모뷰에서 대응되는 model이 envronmentObject(_:)의 호출로 셋팅되도록 해야합니다.
App에서 object가 다양한 곳에서 활용되어햐 하고, 하위 뷰들을 생성할때마다 초기값으로 전달하지않기를 원한다면 @EnvtionmentObject를 활용할 수 있습니다.
struct EnvironmentUsingView: View {
@EnvironmentObject var dependency: DataProvider
var body: some View {
Text(dependency.currentValue)
}
}
struct MyApp: App {
@StateObject var dataProvider = DataProvider()
var body: some Scene {
WindowGroup {
EnvironmentUsingView()
.environmentObject(dataProvider)
}
}
}
EnvironmentUsingView의 상위인 MyApp에서 DataProvider Type인 dataProvider를 .environmentObject(_:)로 전달함으로써 모든 하위뷰들이 사용할 수 있도록 할 수 있습니다.
@EnvironmentObject는 @ObservedObject와 비슷한 기능을 제공합니다.
@EnvironmentObject가 하나라도 변경되면 view는 리렌더링 됩니다.
가장 큰 차이점은 @EnvironmentObject가 @ObservedObject 보다 더 큰 앱 전체와 같은 범위에서 사용된다는 점 입니다.