Study
SwiftUI

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

Editor Latihan

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.