@EnvironmentObject - это
property wrapper, который позволяет передавать общие данные между несколькими
View без явной передачи через инициализатор.
Как использовать:
Создаем ObservableObject:
class UserSettings: ObservableObject {
@Published var isDarkMode = false
}
Добавляем в Environment в корневом View:
@main
struct MyApp: App {
var settings = UserSettings()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(settings) // Передаем объект в корневой вью
}
}
}
Используем в любом дочернем View:
struct ProfileView: View {
@EnvironmentObject var settings: UserSettings // Автоматическая подписка на объек в сабвью
var body: some View {
Toggle("Темная тема", isOn: $settings.isDarkMode)
}
}
Ключевые особенности:
- Автоматическое обновление: View перерисовывается при изменении @Published свойств.
- Глобальный доступ: объект доступен в любой части иерархии View без цепочки @Binding.
- Безопасность: если объект не передан в .environmentObject(), приложение крашнется — это помогает находить ошибки на раннем этапе.
Когда использовать?
- Для глобальных настроек (тема, язык, авторизация и т.д.).
- Когда нужно делиться данными между несвязанными View.
- Вместо долгих цепочек @Binding / @ObservedObject.