Study
SwiftUI

@EnvironmentObject

Penjelasan

Meneruskan ObservableObject secara manual lewat parameter initializer bisa merepotkan kalau objek itu dibutuhkan di banyak View yang letaknya dalam (deeply nested) — kamu harus meneruskannya berjenjang lewat setiap View perantara meskipun View perantara itu sendiri tidak memakainya. @EnvironmentObject menyelesaikan ini: objek 'disuntikkan' sekali ke bagian atas pohon View lewat modifier .environmentObject(objek), lalu View mana pun di bawahnya (sedalam apa pun) bisa langsung mengaksesnya dengan mendeklarasikan @EnvironmentObject var namaProperti: TipeObjek. Cocok untuk state benar-benar bersifat app-wide, misalnya sesi login pengguna atau pengaturan tema aplikasi. Jangan berlebihan memakainya untuk state yang sebenarnya cuma dipakai satu-dua View — itu tetap lebih jelas pakai @State atau @ObservedObject biasa.

Contoh Konsep

import SwiftUI

class SesiPengguna: ObservableObject {
    @Published var namaPengguna = "Tamu"
}

struct ProfilBadgeView: View {
    @EnvironmentObject var sesi: SesiPengguna

    var body: some View {
        Text("Login sebagai: \(sesi.namaPengguna)")
    }
}

struct RootApp: View {
    @StateObject var sesi = SesiPengguna()

    var body: some View {
        ProfilBadgeView()
            .environmentObject(sesi)
    }
}

Praktikum

Buat class PengaturanTema: ObservableObject dengan @Published var modeGelap = false. Buat View SwitchTemaView yang mengakses lewat @EnvironmentObject dan menampilkan Toggle untuk modeGelap.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Kalau lupa memanggil .environmentObject(objek) di ancestor View, aplikasi akan crash saat runtime dengan pesan 'No ObservableObject of type X found' — ini bukan compile error, jadi mudah terlewat sampai kamu benar-benar menjalankan View tersebut.