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會將其存儲在特殊的框架內存中,以將您的數據保存在場景或視圖生命週期之外的安全位置。