Lição: 74: Objetos de Ambiente e @EnvironmentObject no SwiftUI
O SwiftUI fornece uma maneira poderosa de gerenciar estados em sua aplicação usando @EnvironmentObject
. Nesta aula, vamos explorar como usar objetos de ambiente para compartilhar dados entre as views sem a necessidade de passar dados de forma complicada através de inicializadores.
O que é um Objeto de Ambiente?
Um objeto de ambiente é um tipo de referência que pode ser compartilhado facilmente entre views em uma aplicação SwiftUI. Ele é ideal para dados que muitas views dependem, mas que não precisam ser passados diretamente através do inicializador de cada view. Isso resulta em um código mais limpo e modular.
Usando @EnvironmentObject
Para usar @EnvironmentObject
, siga estes passos:
- Crie um ObservableObject: Defina uma classe que conforme ao protocolo
ObservableObject
. - Publique Propriedades: Utilize o wrapper de propriedade
@Published
em qualquer propriedade que você deseja atualizar automaticamente as views quando houver mudanças. - Injete o Objeto de Ambiente: Use o modificador
environmentObject(_:)
para injetar seu objeto na hierarquia de views. - Acesse o Objeto de Ambiente: Use
@EnvironmentObject
em qualquer view filha para acessar as propriedades publicadas.
Passo 1: Crie um ObservableObject
Vamos criar uma classe simples UserSettings
que mantém as preferências do usuário.
import SwiftUI
import Combine
class UserSettings: ObservableObject {
@Published var username: String = "Visitante"
@Published var notificationsEnabled: Bool = true
}
Passo 2: Crie a View Raiz
Em seguida, vamos criar uma view raiz que inicializa uma instância de UserSettings
e a injeta no ambiente.
struct ContentView: View {
@StateObject var userSettings = UserSettings()
var body: some View {
VStack {
Text("Bem-vindo, \(userSettings.username)!")
NotificationSettingsView() // View filha
}
.environmentObject(userSettings) // Injeta o objeto UserSettings
}
}
Passo 3: Crie uma View Filha
Agora, vamos criar uma view filha que pode acessar o objeto de ambiente UserSettings
.
struct NotificationSettingsView: View {
@EnvironmentObject var userSettings: UserSettings // Acessando o objeto de ambiente
var body: some View {
Toggle(isOn: $userSettings.notificationsEnabled) {
Text("Ativar Notificações")
}
.padding()
}
}
Passo 4: Atualize o Objeto de Ambiente
Você pode facilmente atualizar o username
na ContentView
, e isso será refletido automaticamente em qualquer view filha acessando o UserSettings
.
struct UpdateUsernameView: View {
@EnvironmentObject var userSettings: UserSettings // Acessando o objeto de ambiente
@State private var newUsername: String = ""
var body: some View {
VStack {
TextField("Digite o nome de usuário", text: $newUsername)
.padding()
Button("Atualizar Nome de Usuário") {
userSettings.username = newUsername
newUsername = ""
}
}
.padding()
}
}
Exemplo Completo de Código
Aqui está o código completo juntando tudo.
import SwiftUI
import Combine
// Definição do ObservableObject
class UserSettings: ObservableObject {
@Published var username: String = "Visitante"
@Published var notificationsEnabled: Bool = true
}
struct ContentView: View {
@StateObject var userSettings = UserSettings()
var body: some View {
VStack {
Text("Bem-vindo, \(userSettings.username)!")
NotificationSettingsView()
UpdateUsernameView()
}
.environmentObject(userSettings)
}
}
struct NotificationSettingsView: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
Toggle(isOn: $userSettings.notificationsEnabled) {
Text("Ativar Notificações")
}
.padding()
}
}
struct UpdateUsernameView: View {
@EnvironmentObject var userSettings: UserSettings
@State private var newUsername: String = ""
var body: some View {
VStack {
TextField("Digite o nome de usuário", text: $newUsername)
.padding()
Button("Atualizar Nome de Usuário") {
userSettings.username = newUsername
newUsername = ""
}
}
.padding()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Conclusão
Usar @EnvironmentObject
no SwiftUI fornece uma maneira limpa e eficiente de compartilhar dados entre views. É particularmente útil para gerenciar configurações do usuário, estado do aplicativo e outros recursos compartilhados. Lembre-se de usar @StateObject
para criar seus objetos de ambiente na view raiz e @EnvironmentObject
para acessá-los nas views filhas. Esse padrão simplifica seu código e o torna mais fácil de manter. Boa programação!