EnvironmentObject

A linked View property that reads a `ObservableObject` supplied by an ancestor view that will automatically invalidate its view when the object changes.

State Management

Share Data between Views using @EnvironmentObject

class User: ObservableObject {
    @Published var name = "Enes Karaosman"
}

// View 1
struct EditView: View {
    @EnvironmentObject var user: User
    
    var body: some View {
        TextField("Name", text: $user.name)
    }
}

// View 2
struct DisplayView: View {
    @EnvironmentObject var user: User
    
    var body: some View {
        Text(user.name)
    }
}

// Container View to demonstrate communication
struct DemoView: View {
    let user = User()
    
    var body: some View {
        VStack {
            EditView()//.environmentObject(user)
            DisplayView()//.environmentObject(user)
        }
        // Since both views wrapped by same container
        // We can bind here as well.
        .environmentObject(user)
    }
}

EnvironmentObject does not require to be passed explicitly down to child views.

Lets also create 2 dummy child view.

Now when we edit envTest (EnvironmentObject) in any child, the changes reflected everywhere it is used.

EnvironmentObject across child views

Last updated

Was this helpful?