swiftUI笔记之@StateObject和@ObservedObject

在我之前@State研究中我们探讨过@State,通过它,我们可以方便的将值类型数据作为View的Source of truth(单一数据源)。在SwiftUI 1.0时代,如果想将引用类型作为source of truth,通常的方法是使用@EnvironmentObject或者 @ObservedObject。

@StateObject 是在 SwiftUI 2.0 中才添加的属性包装器,它的出现解决了在某些情况下使用 @ObservedObject 视图会出现超预期的问题

示例:
user类

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

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

1
2
3
4
5
6
7
struct ContentView: View {
@StateObject var user = User()

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

这将确保视图更新时不会破坏 User 实例

以前,可能曾经使用 @ObservedObject 来获得相同的结果,但这很危险–有时且仅在某些情况下,@ObservedObject 可能会意外释放其存储的对象,因为它并不是被设计为最终的真理来源。 目的。 @StateObject 不会发生这种情况,因此应该改用它。

推荐阅读

@StateObject 和 @ObservedObject 的区别和使用