Управление состоянием пользовательского интерфейса — важнейшая часть любого приложения SwiftUI. В SwiftUI переменные окружения (environment values) являются одним из механизмов, предоставляемых для работы с общим состоянием нескольких представлений. Переменные окружения могут быть доступны или установлены из любого места в иерархии представлений и особенно полезны для совместного использования общих данных или функциональности.
Рассмотрим пример, в котором вы создаете пользовательское значение окружения для динамического изменения темы вашего приложения:
// Defining a custom environment value
struct ThemeKey: EnvironmentKey {
static let defaultValue: Theme = .light
}
extension EnvironmentValues {
var theme: Theme {
get { self[ThemeKey.self] }
set { self[ThemeKey.self] = newValue }
}
}
// Enum for the different themes
enum Theme {
case light, dark
}
extension View {
func theme(_ theme: Theme) -> some View {
environment(\.theme, theme)
}
}
struct ThemedView: View {
@Environment(\.theme) var theme: Theme
var body: some View {
VStack {
if theme == .light {
Text("Light Theme")
.foregroundColor(.black)
.background(Color.white)
} else {
Text("Dark Theme")
.foregroundColor(.white)
.background(.black)
}
}
.padding()
}
}
struct ContentView: View {
@State var theme: Theme = .light
var body: some View {
VStack {
Button("Switch Theme") {
// Setting our custom environment value
switch theme {
case .dark:
theme = .light
case .light:
theme = .dark
}
}
ThemedView()
}
.theme(theme)
}
}
Предварительный просмотр для этого кода должен быть таким:
Вы можете создать пользовательскую переменную среды для совместного использования состояния в разных представлениях.
В приведенном выше коде:
ThemeKey— это пользовательскийEnvironmentKeyсо значением по умолчанию.light. Он используется для задания темы по умолчанию для среды.- Расширение
EnvironmentValuesвключает новое свойствоtheme. Оно использует ваш ключThemeKeyдля получения или установки темы. Theme— это перечисление, которое описывает возможные темы, а именноlightиdark.- Расширение метода
themeдляViewпозволяет применить тему к любому представлению, установив значение окруженияtheme. ThemedView— это представление, которое настраивает свой внешний вид в зависимости от текущего значенияtheme. Оно считывает это значение с помощью обертки свойства@Environment.ContentViewсодержит кнопку, которая переключает тему между светлой и темной. Это изменение передается вThemedViewчерез значение переменной окруженияtheme.
Используя переменные окружения, вы можете эффективно обмениваться общими данными о состоянии и поведении между представлениями, упрощая код и делая представления пригодными для переиспользования.
← Предыдущая статья: Использование AppStorage и SceneStorage для хранения состояния

