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で使用する方法だけにした方が設計が綺麗だと思います。


コメント