@EnvironmentObject
全View間で使えるグローバル変数的なものです。
変数に変更が掛かるとすべてのViewで連動して変更されます。
注意点として、EnvironmentObjectをインスタンス化したらすべてのプレビューの所でもインスタンス化してあげる事と、グローバル変数の危険性について理解して使うこと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import SwiftUI class aaa: ObservableObject { //用意するクラス @Published var a: Int = 0 } struct ContentView: View{ @EnvironmentObject var b: aaa // = ではなく : でインスタンス化 var body: some View { Button(action: { b.a += 1 }){ Text("\(String(b.a))") } } } struct ccc: View { //遷移先等 @EnvironmentObject var b: aaa var body: some View { Text("\(String(b.a))") } } #Preview { ContentView() .environmentObject(aaa()) //EnvironmentObjectをインスタンス化したすべてのページでこの記述をする(クラス名は作ったクラス名) } |
@StateObject
こちらはインスタンス化したViewの中でのみ状態変化を保持します。(View毎でインスタンス化すると別物扱いになります)
なので他のViewで変数の状態変化を共有させたい時は引数で渡す必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import SwiftUI class aaa: ObservableObject { //用意するクラス @Published var a: Int = 0 } struct ContentView: View{ @StateObject var b = aaa() //こちらは = で通常のインスタンス化 var body: some View { Button(action: { b.a += 1 }){ Text("\(String(b.a))") } ccc(c: b) //他Viewに渡す } } struct ccc: View { @StateObject var c: aaa //受け取り var body: some View { Text("\(String(c.a))") } } #Preview { ContentView(b: aaa()) } |
コメント