Site icon AppTractor

Поваренная книга SwiftUI: шаринг состояний между представлениями с помощью объектов окружения

Хотя ObservableObject и ObservedObject отлично подходят для обмена состоянием между представлениями, они требуют, чтобы вы передавали состояние вручную от родительского View к дочернему. Но что, если вы хотите обмениваться данными между несколькими представлениями в вашем приложении, не передавая их явно? Вот тут-то и приходят на помощь объекты окружения (Environment Objects).

Свойства-обертки EnvironmentObject в SwiftUI предоставляют способ обмена данными во всем приложении. Их можно рассматривать как глобальное хранилище данных, к которому может обратиться любое представление. Это особенно полезно, когда у вас есть глубоко вложенные представления и вы не хотите передавать данные через несколько слоев.

Чтобы использовать объект окружения, сначала нужно определить модель данных как объект ObservableObject. Например, создадим объект GameSettings, в котором будет храниться счет игры.

class GameSettings: ObservableObject {
  @Published var score = 0
}

Затем в корне приложения вы предоставляете этот объект иерархии представлений с помощью модификатора environmentObject.

struct ContentView: View {
  var body: some View {
    GameView()
      .environmentObject(GameSettings())
  }
}

Теперь любое представление в иерархии может получить доступ к GameSettings, используя обертку свойства EnvironmentObject.

struct GameView: View {
  @EnvironmentObject var settings: GameSettings

  var body: some View {
    VStack {
      Text("Score: \(settings.score)")
      Button("Increment Score") {
        settings.score += 1
      }
    }
  }
}

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

Используйте EnvironmentObject, чтобы сделать данные доступными во всем приложении.

В этом примере GameView имеет доступ к объекту GameSettings и может обновлять счет. Когда кнопка нажата, счет увеличивается, и представление Text автоматически обновляется, поскольку оно наблюдает за объектом GameSettings.

Примечание: Обертка свойства EnvironmentObject не предоставляет значения по умолчанию. Объект должен быть указан где-то в представлениях-предках с помощью .environmentObject(_:), иначе ваше приложение аварийно завершит работу.

← Предыдущая статья: Состояние, привязка, ObservableObject и ObservedObject

Источник

Exit mobile version