SwiftUI中@ StateObject,@ EnvironmentObject和@ObservedObject之间的区别
本文我们来研究一下SwiftUI中的数据流。在本文中,我们将讨论@ StateObject,@ EnvironmentObject和@ObservedObject属性包装器之间的区别。我知道这是SwiftUI中新手最困惑的话题。
为什么SwiftUI确实需要属性包装器?
SwiftUI使用不可变的结构类型来描述视图层次结构。 SwiftUI提供的所有视图都是不可变的。因此,SwiftUI为我们提供了许多属性包装器来处理数据突变。属性包装器允许我们在SwiftUI视图中声明它们,但将数据存储在声明它的视图之外。
@StateObject
@StateObject是新的属性包装器,用于初始化符合ObservableObject协议的类的实例,并将其存储在SwiftUI框架的内部存储器中。 SwiftUI仅为每个声明@StateObject的容器创建一次,并将其保存在视图生命周期之外。让我们看一些使用@StateObject保持整个应用状态的示例。
import SwiftUI
@main
struct CardioBotApp: App {
@StateObject var store = Store(
initialState: AppState(),
reducer: appReducer,
environment: AppEnvironment(service: HealthService())
)
var body: some Scene {
WindowGroup {
RootView().environmentObject(store)
}
}
}
如您所见,@ StateObject非常适合存储整个应用程序状态并与应用程序的不同场景或视图共享。 SwiftUI会将其存储在特殊的框架内存中,以将您的数据保存在场景或视图生命周期之外的安全位置。