@EnvironmentObject (@EnvironmentObject)
«شیء محیطی» یعنی وضعیت سراسری اپ. با @EnvironmentObject آن را به همه ویوها می رسانیم. والد شیء را تزریق می کند. فرزند فقط می خواند و UI تازه می شود. مثل اعلانیه مدرسه که همه می بینند.
اشتراک حالت سراسری با @EnvironmentObject
والد، شیء مشترک را با .environmentObject تزریق می کند. سپس فرزند با @EnvironmentObject همان شیء را مصرف می کند. بنابراین تغییرات از بالا پخش می شود.
import SwiftUI
final class AppSettings: ObservableObject {
@Published var theme = "Light"
}
struct Root: View {
@StateObject private var settings = AppSettings()
var body: some View {
VStack(spacing: 8) {
Button("Toggle") {
settings.theme = (settings.theme == "Light") ? "Dark" : "Light"
}
Child()
}
.environmentObject(settings)
.padding()
}
}
struct Child: View {
@EnvironmentObject var settings: AppSettings
var body: some View {
Text("Theme: \(settings.theme)")
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
Root()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
گام های سریع
- یک کلاس ObservableObject بساز.
- ویژگی های اشتراکی را @Published کن.
- در والد، با .environmentObject تزریق کن.
- در فرزند، با @EnvironmentObject مصرف کن.
نکته: اگر تزریق یادت برود، برنامه کرش می کند. همیشه والد را چک کن.
ارتباط با جریان داده
برای مرور مسیر کامل، صفحه جریان داده در SwiftUI را ببین. همچنین تفاوت مالکیت مدل در @ObservedObject & @StateObject توضیح شده است.
جمع بندی سریع
- @EnvironmentObject برای حالت سراسری است.
- والد تزریق می کند؛ فرزند مصرف می کند.
- @Published باعث تازه سازی UI می شود.
- فراموشی تزریق، خطا ایجاد می کند.