1.StateObject 的概念和使用

SwiftUI 的 @StateObject 属性包装器旨在填补状态管理中的一个非常具体的空白: 当需要在一个视图中创建引用类型并确保它保持活动状态以在该视图和共享的其他视图中使用时。

例如,考虑一个简单的 User 类,如下:

class User: ObservableObject {
    var username = "@twostraws"
}

如果想在各种视图中使用它,需要在 SwiftUI 外部创建它并将其注入, 或者在一个 SwiftUI 视图中创建它并使用 @StateObject,如下所示:

struct ContentView: View {
    @StateObject var user = User()

    var body: some View {
        Text("Username: \(user.username)")
    }
}

2.如何使用 @StateObject 创建和监控外部对象?

如下所示:

// An example class to work with
class Player: ObservableObject {
    @Published var name = "Taylor"
    @Published var age = 26
}

// A view that creates and owns the Player object.
struct ContentView: View {
    // 创建的时候,必须使用@StateObject而不是@ObservedObject
    @StateObject var player = Player()

    var body: some View {
        NavigationView {
            NavigationLink(destination: PlayerNameView(player: player)) {
                Text("Show detail view")
            }
        }
    }
}

// A view that monitors the Player object for changes, but
// doesn't own it.
struct PlayerNameView: View {
    // 此处只是监听Player改变,并不拥有它
    @ObservedObject var player: Player

    var body: some View {
        Text("Hello, \(player.name)!")
    }
}

总结:@StateObject用于创建复杂对象, @ObservedObject用于接收复杂对象, @State用于基本数据类型比如Int,String,Array