SwiftUI 常用 Property Wrappers 之 StateObject

🧠🔋

对于 ObservableObject 当我们在一个 View 里创建,在这个 View 里使用,使用 ObservedObject 没问题,当这个ObservableObject 在下一个 View 里也使用的时候,那么在第一个 View 里初始化的时候最好使用 State Object,使用StateObject 创建 Object 的 View 会保持和 Object 的同步,避免某些时候导致的 View 存在但是 Object 已经被销毁的情况。

struct StateObjectView: View {
    @StateObject var user = PokeUser()
    @State var show = false
    var body: some View {
        Button {
            show.toggle()
        } label: {
            VStack(spacing: 16) {
                Text("Show")
                Text("Number: \(user.number)")
            }
        }.sheet(isPresented: $show) {
            StateObjectDetailView(user: user)
        }
    }
}

struct StateObjectDetailView: View {
    @ObservedObject var user: PokeUser
    var body: some View {
        Button {
            user.number += 1
        } label: {
            Text("Number +1, Number: \(user.number)")
        }
    }
}

class PokeUser: ObservableObject {
    @Published var number = 0
}

可以看到在第一个初始 View 里我们使用 StateObject 创建了 user,在后面的 StateObjectDetailView 我们使用Observedobject 来使用 user,当在第二个页面的 user number 变化的时候,相应的第一个页面的 user number 也会一样跟随变化。