SwiftUI – アプリで情報を共有したい(environmentObject)

SwiftUI

SwiftUI で 親ビュー → 子ビュー → 孫ビュー と、
同じ情報をずっと渡して使いたいケースがあります。
引数で全部渡すこともできますが、ストレスを感じます。
そんな時は、
environmentObjectモディファイア
を使うとストレスフリーになります。

ポイントは、アプリの全ビューで共通した情報を扱う場合のみ使うのがベストです。

environmentObject使い方

Appで、
①アプリ全体で共有したい状態(ObservableObject)を準備します。
environmentObjectモディファイアで注入します。

コードは、2箇所だけです。

struct testApp: App {
    // ①アプリで共有したい状態
    @StateObject private var appState = AppState()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                // ②これで全ての子ビューで参照可能となるため
                // 1箇所で宣言すればいい
                .environmentObject(appState)
        }
    }
}

使いたいビューで、@EnvironmentObjectで宣言すると、どこでも読み書き可能になります。

struct ContentView: View {
    // 使いたいビューで、@EnvironmentObjectで宣言すると使用可能
    @EnvironmentObject var appState: AppState
    
    var body: some View {
        Text("ContentView:\(appState.userName)")

たったこれだけで、アプリのすべてのビューで使い放題になります。

environmentObjectモディファイアは、色々な使い方ができますが、Appで使用する方法だけにした方が設計が綺麗だと思います。

コメント

タイトルとURLをコピーしました