SwiftUI之如何使用@EnvironmentObject在视图之间共享数据
生活随笔
收集整理的這篇文章主要介紹了
SwiftUI之如何使用@EnvironmentObject在视图之间共享数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 對于應該與應用程序中的許多視圖共享的數據,SwiftUI 為我們提供了 @EnvironmentObject 屬性包裝器,這讓我們可以在任何需要的地方共享模型數據,同時還確保我們的視圖在數據更改時自動保持更新。
- 可以把 @EnvironmentObject 看作在許多視圖上使用,是一種比 @ObservedObject 更智能、更簡單的方式。與其在視圖 A 中創建一些數據,然后將其傳遞給視圖 B,然后是視圖 C,然后是視圖 D 才最終使用它,可以在視圖 A 中創建它并將其放入環境中,以便視圖 B、C 和 D 將自動訪問它。
- 就像 @ObservedObject 一樣,永遠不會為 @EnvironmentObject 屬性賦值。相反,它應該從其他地方傳入,最終您可能想要使用 @StateObject 在某處創建它。但是,與 @ObservedObject 不同的是,我們不會手動將對象傳遞到其它視圖中。相反,使用將數據發送到一個名為 environmentObject() 的修飾符,這使得該對象在 SwiftUI 的環境中可用于該視圖以及其中的任何其它對象(需要注意:環境對象必須由父視圖提供,如果 SwiftUI 找不到正確類型的環境對象,程序就會崩潰,這也適用于預覽,所以要小心)、
- 為了演示環境對象,我們將定義三件事:
-
- 一個 GameSettings 類,其中包含一個名為 score 的已發布屬性;
-
- 期望在環境中接收 GameSettings 對象并顯示其 score 屬性的 ScoreView 視圖;
-
- 一個創建 GameSettings 對象的 ContentView 視圖,有一個按鈕可以將 1 添加到它的 score 屬性,還有一個 NavigationLink 來顯示詳細信息視圖。
- 如下所示:
- 分析該代碼中幾個重要部分:
-
- 就像 @StateObject 和 @ObservedObject 一樣,所有與 @EnvironmentObject 一起使用的類都必須符合ObservableObject 協議;
-
- 將 GameSettings 放入導航視圖的環境中,這意味著導航視圖中的所有視圖都可以根據需要讀取該對象,以及導航視圖顯示的任何視圖;
-
- 當使用 @EnvironmentObject 屬性包裝器時,聲明希望接收的事物類型,但并沒有創建它,畢竟我們希望從環境中接收它;
-
- 因為我們的細節視圖顯示在導航視圖中,所以它可以訪問相同的環境,這意味著它可以讀取我們創建的 GameSettings 對象;
-
- 不需要將環境中的 GameSettings 實例與 ScoreView 中的 settings 屬性顯式關聯,SwiftUI 會自動確定它在環境中具有一個 GameSettings 實例,因此它就是它使用的實例。
- 既然我們的視圖依賴于存在的環境對象,那么更新預覽代碼以提供一些要使用的示例設置也很重要。 例如,使用 ScoreView().environmentObject(GameSettings()) 之類的東西進行預覽應該這樣做。
- 如果需要向環境添加多個對象,應該添加多個 environmentObject() 修飾符,只需一個接一個地調用它們。
總結
以上是生活随笔為你收集整理的SwiftUI之如何使用@EnvironmentObject在视图之间共享数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SwiftUI之深入解析@StateOb
- 下一篇: SwiftUI之如何创建常量绑定与自定义