iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Mobile Development

SwiftUI快速入門30天系列 第 17

Day17 - @EnvironmentObject 和 @StateObject,使用環境物件和狀態物件管理資料

  • 分享至 

  • xImage
  •  

在 SwiftUI 中,@EnvironmentObject 和 @StateObject 是兩個重要的屬性包裝器,用於管理和共享資料狀態。

@StateObject

@StateObject 用於管理視圖的本地狀態。當你有一個需要在多個地方使用的資料物件時,你可以將這個資料物件設置為 @StateObject。這個資料物件將由視圖擁有和管理,SwiftUI 會負責在資料變更時自動重新渲染視圖。

使用情境

假設你有一個 Counter 類別,計數會在應用程式的不同部分更新。你可以這樣使用 @StateObject:

class Counter: ObservableObject {
    @Published var count = 0
}

struct ContentView: View {
    @StateObject private var counter = Counter()
    
    var body: some View {
        VStack {
            Text("Count: \(counter.count)")
            Button("Increment") {
                counter.count += 1
            }
        }
    }
}

在這裡,counter 物件是由 ContentView 所擁有,並且在任何 counter.count 的變更時,自動更新視圖。

@EnvironmentObject

@EnvironmentObject 是用來在應用程式的多個視圖間共享資料的。它允許我們將資料物件注入到應用程式的環境中,讓子視圖可以輕鬆地訪問這些共享資料。

使用情境

假設你有一個全局的設定物件:

class Settings: ObservableObject {
    @Published var isDarkMode = false
}

struct ContentView: View {
    @EnvironmentObject var settings: Settings
    
    var body: some View {
        Toggle("Dark Mode", isOn: $settings.isDarkMode)
    }
}

在這裡,我們使用 @EnvironmentObject 來接收從父視圖或場景注入的 settings 物件。這使得 ContentView 可以訪問和操作全局的設定資料。

區分與功用

  1. @StateObject 是在視圖內創建和擁有物件,適用於該視圖的狀態管理。
  2. @EnvironmentObject 是跨越多個視圖共享資料,通常由外部注入的物件。
    多層傳的適用於這個^

總之,@StateObject 用於視圖的內部狀態管理,而 @EnvironmentObject 用於在不同視圖間共享資料。在使用這些屬性包裝器時,理解它們的生命周期與作用範圍至關重要,這將確保應用程式的資料管理清晰且高效。


上一篇
Day16 - GeometryReader 和 ZStack,使用幾何讀取器和 Z 軸堆疊
下一篇
Day18 - URLSession 和 Codable,使用網路請求獲取資料
系列文
SwiftUI快速入門30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言