Site icon AppTractor

Поваренная книга SwiftUI: создание и доступ к переменным окружения в SwiftUI

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

Предварительный просмотр для этого кода должен быть таким:

Вы можете создать пользовательскую переменную среды для совместного использования состояния в разных представлениях.

В приведенном выше коде:

Используя переменные окружения, вы можете эффективно обмениваться общими данными о состоянии и поведении между представлениями, упрощая код и делая представления пригодными для переиспользования.

← Предыдущая статья: Использование AppStorage и SceneStorage для хранения состояния

Источник

Exit mobile version