@StateObject vs @ObservedObject
Penjelasan
@StateObject dan @ObservedObject sama-sama dipakai untuk mengamati ObservableObject, tapi punya tanggung jawab kepemilikan yang berbeda. @StateObject dipakai di View yang PERTAMA KALI membuat/menghidupkan instance objek tersebut — SwiftUI menjamin objek itu hanya diinisialisasi sekali sepanjang hidup View, bahkan kalau body View-nya dievaluasi ulang berkali-kali. @ObservedObject dipakai di View yang MENERIMA objek dari luar (parent lain sudah membuatnya) — ia tidak bertanggung jawab atas siklus hidup objek itu. Kesalahan umum: memakai @ObservedObject untuk membuat objek langsung di initializer View (mis. @ObservedObject var vm = MyViewModel()). Ini berbahaya karena setiap kali parent View di-render ulang, View child ikut dibuat ulang, dan @ObservedObject TIDAK mencegah objeknya ikut dibuat baru — akibatnya state yang sudah diubah bisa hilang tiba-tiba. Aturan sederhana: kalau kamu menulis '= SesuatuViewModel()' di deklarasi, gunakan @StateObject. Kalau objek diterima lewat parameter, gunakan @ObservedObject.
Contoh Konsep
import SwiftUI
class TimerViewModel: ObservableObject {
@Published var detik = 0
}
// View ini MEMBUAT objeknya sendiri -> @StateObject
struct TimerScreen: View {
@StateObject private var vm = TimerViewModel()
var body: some View {
TimerDisplay(vm: vm)
}
}
// View ini MENERIMA objek dari luar -> @ObservedObject
struct TimerDisplay: View {
@ObservedObject var vm: TimerViewModel
var body: some View {
Text("Detik: \(vm.detik)")
}
}
Praktikum
Buat class ChatViewModel: ObservableObject dengan @Published var pesanTerbaru = "". Buat ChatScreen yang MEMBUAT instance-nya sendiri (pilih property wrapper yang benar), lalu teruskan ke child view BubbleView yang MENERIMA dari luar (pilih property wrapper yang benar juga).
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Sejak iOS 17, Apple memperkenalkan makro @Observable sebagai alternatif ObservableObject yang lebih ringkas (tidak perlu @Published per property). Tapi memahami ObservableObject + @StateObject/@ObservedObject tetap penting karena masih sangat banyak dipakai di codebase dan tutorial yang ada.