@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.
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.