Управление состоянием пользовательского интерфейса — важнейшая часть любого приложения 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 для хранения состояния