SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
19.11.2024

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:

  1. Crie um ObservableObject: Defina uma classe que conforme ao protocolo ObservableObject.
  2. Publique Propriedades: Utilize o wrapper de propriedade @Published em qualquer propriedade que você deseja atualizar automaticamente as views quando houver mudanças.
  3. Injete o Objeto de Ambiente: Use o modificador environmentObject(_:) para injetar seu objeto na hierarquia de views.
  4. 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!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!