Разработка
Поваренная книга SwiftUI: шаринг состояний между представлениями с помощью объектов окружения
Свойства-обертки EnvironmentObject в 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 } } } }
Вот как выглядит предварительный просмотр:
В этом примере GameView
имеет доступ к объекту GameSettings
и может обновлять счет. Когда кнопка нажата, счет увеличивается, и представление Text автоматически обновляется, поскольку оно наблюдает за объектом GameSettings
.
Примечание: Обертка свойства EnvironmentObject
не предоставляет значения по умолчанию. Объект должен быть указан где-то в представлениях-предках с помощью .environmentObject(_:)
, иначе ваше приложение аварийно завершит работу.
← Предыдущая статья: Состояние, привязка, ObservableObject и ObservedObject