SwiftUI-এ @Environment হল একটি property wrapper যা সিস্টম পরিবেশ থেকে মান পড়ার জন্য, যা স্বচালিতভাবে View পদানুক্রমে বিতরিত হয়। উপাদানটি রঙ স্কিম, লোকেল, ফন্ট আকার, managedObjectContext এবং দজিনের অন্য সিস্টম প্যারামিটারের অ্যাক্সেস প্রদান করে। Apple Developer Documentation (2025) অনুযায়ী, @Environment গারন্টি দেয় যে পরিবেশ মানের যেকোনো পরিবর্তন সব সদস্যতাপ্রাপ্ত View-কে পুনরায় আঙ্কনের কারণ হয়, যা ম্যানুয়াল কল ছাড়াই রিএক্টিভ ইন্টারফেস আপডেট নিশ্চিত করে।
মূল বিষয়
@Environment হল একটি SwiftUI property wrapper যা সিস্টম পরিবেশ থেকে মান পড়ার জন্য ডিজাইন করা হয়েছে। পরিবেশ হল মানের একটি পদানুক্রমিক কন্টেইনার যা SwiftUI স্বচালিতভাবে প্যারেন্ট Views থেকে চাইল্ড Views-এ বিতরিত করে। প্রতিটি পরিবেশ মান একটি কী দ্বারা চিহ্নিত করা হয় — একটি ٱধারন যা EnvironmentKey প্রোটোকল মেনে চলে।
পরিবেশ প্রক্রিয়াটি ফ্রেমওয়ার্ক স্তরে dependency injection-এর মতো: সিস্টম মানের একটি পূর্বনির্ধারিত সেট প্রদান করে — রঙ স্কিম (হালকা/অন্ধকার), লোকেল, ফন্ট আকার, Core Data-এর জন্য managedObjectContext, স্ক্রিন বন্ধ করার জন্য dismiss, এবং অন্যান্য। একটি View যা একটি নির্দিষ্ট কীর সাথে @Environment ঘোষণা করে স্বচালিতভাবে বর্তমান মান প্রাপ্ত করে এবং এটি পরিবর্তিত হলে পুনরায় আঙ্কন করে।
SwiftUI পরিবেশ আর্কিটেক্চার EnvironmentValues প্রোটোকলের উপর ভিত্তি করে — একটি গঠন যার মধ্যে সব সিস্টম মান রয়েছে। প্রতিটি মান getter এবং setter সহ এই গঠনের একটি বৈশিষ্ট্য হিসাবে সংরক্ষিত হয়। @Environment একটি নির্দিষ্ট বৈশিষ্ট্য অ্যাক্সেস করতে key path ব্যবহার করে: @Environment(\.colorScheme) — রঙ স্কিমের অ্যাক্সেস, @Environment(\.locale) — লোকেলের অ্যাক্সেস।
Property wrapper @Environment দুটি মূল প্রক্রিয়া বাস্তবায়ন করে: পরিবেশ থেকে একটি মান পড়া এবং এর পরিবর্তনের সদস্যতা নেওয়া। যখন একটি View তৈরি হয়, SwiftUI সব @Environment বৈশিষ্ট্যের মধ্য দিয়ে যায় এবং সেগুলিকে বর্তমান প্রসঙ্গ থেকে সংশ্লিষ্ট মানের সাথে লিঙ্ক করে। যদি একটি প্যারেন্ট View .environment() মডিফায়ারের মাধ্যমে একটি মান পরিবর্তন করে, তবে সেই মান পড়া সব চাইল্ড View স্বচালিতভাবে পুনরায় আঙ্কন করে।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য: @Environment উদ্ভাবিক মান সমর্থন করে। যদি পদানুক্রমে কোনো মান সেট করা না থাকে, তবে EnvironmentKey-এ সংজ্ঞায়িত ডিফল্ট মান ফিরে আসে। সিস্টম কীর জন্য, ডিফল্ট মান সবসময় যুক্তিযুক্ত — উদাহরণস্বরূপ, ডিফল্ট রঙ স্কিম হল .light। কাস্টম কীর জন্য, ডিভেলপার EnvironmentKey প্রোটোকলের defaultValue পদ্ধতিতে ডিফল্ট মান সংজ্ঞায়িত করে।
struct EnvironmentReaderView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.locale) var locale
@Environment(\.sizeCategory) var sizeCategory
var body: some View {
VStack {
Text("Current scheme: \(colorScheme == .dark ? "Dark" : "Light")")
Text("Locale: \(locale.identifier)")
Text("Font size: \(sizeCategory)")
}
}
}
উদাহরণে, View তিনটি সিস্টম পরিবেশ মান পড়ে। যখন colorScheme পরিবর্তিত হয় — উদাহরণস্বরূপ, ব্যবহারকারী সেটিংসে ডার্ক মোড সক্ষম করেছে — View নতুন মান সহ স্বচালিতভাবে পুনরায় আঙ্কন করে। একইভাবে যখন অঞ্চল বা ফন্ট আকার (Dynamic Type) পরিবর্তিত হয়। View-কে বিজ্ঞপ্তিতে সদস্যতা নিতে বা refresh কল করতে হবে না — SwiftUI এটি স্বচালিতভাবে পরিচালনা করে।
SwiftUI ইংটারফেস এবং আচরণের বিভিন্ন দিক আবরণ করা দজিনের সিস্টম পরিবেশ মান প্রদান করে। রঙ স্কিম (\.colorScheme) সবচেয়ে বেশি ব্যবহৃত মানের একটি, যা ইংটারফেসকে হালকা এবং অন্ধকার থিমের সাথে খাপ খায়ার অনুমতি দেয়। লোকেল (\.locale) তারিখ, সংখ্যা এবং মুদ্রা ফরম্যাটিংয়ের জন্য ব্যবহারকারীর আঞ্চলিক সেটিংস ধারণ করে।
Core Data-এর জন্য, managedObjectContext (\.managedObjectContext) ব্যবহৃত হয় — একটি প্রসঙ্গ যা পার্সিস্টেন্স কন্টেইনার থেকে পরিবেশের মাধ্যমে প্রেরণ করা হয়। নেভিগেশনের জন্য, বর্তমান স্ক্রিন বন্ধ করার জন্য dismiss (\.dismiss) এবং মোডাল প্রস্তুতির জন্য isPresented (\.isPresented) উপলব্ধ। ক্যালেন্ডার এবং সময় জোনের জন্য — যথাক্রমে calendar এবং timeZone।
| Key Path | ধরন | উদ্দেশ্য |
|---|---|---|
| \.colorScheme | ColorScheme | হালকা বা অন্ধকার থিম |
| \.locale | Locale | আঞ্চলিক সেটিংস |
| \.sizeCategory | ContentSizeCategory | Dynamic Type ফন্ট আকার |
| \.managedObjectContext | NSManagedObjectContext | Core Data প্রসঙ্গ |
| \.dismiss | DismissAction | স্ক্রিন বন্ধ করুন |
| \.calendar | Calendar | বর্তমান ক্যালেন্ডার |
| \.timeZone | TimeZone | সময় জোন |
| \.horizontalSizeClass | UserInterfaceSizeClass | অনুভূমিক স্ক্রিন আকার |
সিস্টম মানে অ্যাক্সেস করতে, একটি বিন্দু সহ key path ব্যবহার করুন: @Environment(\.dismiss) var dismiss. কম্পাইলার EnvironmentValues-এ key path-এর অস্তিত্ব যাচাই করে, তাই একটি ভুল কী কম্পাইল-টাইম ত্রুটির কারণ হবে। Apple iOS-এর প্রতিটি সংস্করণের সাথে নতুন সিস্টম মান যোগ করে — সম্পূর্ণ তালিকা EnvironmentValues ডকুমেন্টেশনে উপলব্ধ।
একই রকম নাম সত্ত্বেও, @Environment এবং @EnvironmentObject অলাদা উদ্দেশ্য পূরণ করে। @Environment EnvironmentKey-এর মাধ্যমে নিবন্ধিত সিস্টম বা কাস্টম মান পড়ে। @EnvironmentObject হল একটি ObservableObject-এর জন্য property wrapper যা স্পষ্ট কী ছাড়া ধরনের উপর ভিত্তি করে পরিবেশের মাধ্যমে প্রেরণ করা হয়।
@EnvironmentObject dependency injection-এর জন্য ব্যবহৃত হয়: একটি প্যারেন্ট View একটি অবজেক্ট (যেমন ViewModel) তৈরি করে এবং .environmentObject() মডিফায়ারের মাধ্যমে চাইল্ড Views-এ প্রেরণ করে। চাইল্ড Views @EnvironmentObject-এর মাধ্যমে এটি গ্রহণ করে এবং এর বৈশিষ্ট্য পড়তে এবং পরিবর্তন করতে পারে। অন্যদিকে, @Environment হল সিস্টম মানের জন্য শুধু পড়ার জন্য এবং প্রতিপুষ্টি সমর্থন করে না।
| প্যারামিটার | @Environment | @EnvironmentObject |
|---|---|---|
| উদ্দেশ্য | সিস্টম এবং কাস্টম মান | ObservableObject ইনজেক্শন |
| কী | EnvironmentValues key path | অবজেক্টের ধরন অনুসারে |
| লেখা | শুধু পড়া | পড়া এবং লেখা |
| কাস্টম মান | EnvironmentKey-এর মাধ্যমে | ObservableObject শ্রেণীর মাধ্যমে |
| ডিফল্ট মান | হ্যাঁ (defaultValue) | না (প্রেরণ করতে হবে) |
ব্যবহারিক দৃষ্টিকোণে: সিস্টম প্যারামিটার (থিম, লোকেল, ফন্ট আকার) এবং কাস্টম কান্ফিগরেশন যা রানটাইমে পরিবর্তিত হয় না সেগুলিতে অ্যাক্সেস করতে @Environment ব্যবহার করুন। View পদানুক্রমের মাধ্যমে ViewModel বা পরিষেবা প্রেরণ করতে @EnvironmentObject ব্যবহার করুন যখন চাইল্ড উপাদান থেকে অবস্থা পরিবর্তন করার প্রয়োজন হয়।
একটি কাস্টম পরিবেশ মান তৈরি করা দেখা যাক। এর জন্য, আপনাকে EnvironmentKey প্রোটোকল মেনে চলে এমন একটি গঠন সংজ্ঞায়িত করতে হবে এবং EnvironmentValues কে একটি নতুন বৈশিষ্ট্য দিয়ে বিস্তৃত করতে হবে। এটি props ছাড়াই সম্পূর্ণ View ট্রিতে থিম কান্ফিগরেশন বা অ্যাপ সেটিংস প্রেরণ করার অনুমতি দেয়।
struct AppThemeKey: EnvironmentKey {
static let defaultValue: AppTheme = .system
}
extension EnvironmentValues {
var appTheme: AppTheme {
get { self[AppThemeKey.self] }
set { self[AppThemeKey.self] = newValue }
}
}
enum AppTheme { case system, light, dark }
EnvironmentKey প্রোটোকলের স্থির defaultValue বৈশিষ্ট্যের বাস্তবায়ন প্রয়োজন — মান যা ব্যবহার করা হবে যদি প্যারেন্ট View একটি কাস্টম পরিবেশ সেট না করে থাকে। EnvironmentValues বিস্তার কীর সাথে subscript ব্যবহার করে একটি গণনামূলক বৈশিষ্ট্য appTheme যোগ করে। এর পরে, যেকোনো View @Environment(\.appTheme) এর মাধ্যমে মান পড়তে পারে।
struct ThemedView: View {
@Environment(\.appTheme) var appTheme
@Environment(\.colorScheme) var colorScheme
var body: some View {
VStack {
if appTheme == .dark || (appTheme == .system && colorScheme == .dark) {
Text("Dark mode active")
.foregroundStyle(.white)
.background(Color.black)
} else {
Text("Light mode active")
.foregroundStyle(.black)
.background(Color.white)
}
}
}
}
struct ContentView: View {
@State private var selectedTheme = AppTheme.system
var body: some View {
ThemedView()
.environment(\.appTheme, selectedTheme)
}
}
ThemedView দুটি পরিবেশ পড়ে: কাস্টম appTheme এবং সিস্টম colorScheme। সংমিশ্রণ নমনীয় থিম কান্ফিগরেশনের অনুমতি দেয়: ব্যবহারকারী হালকা, অন্ধকার বা সিস্টম থিম বেছে নিতে পারে। যদি সিস্টম নির্বাচিত হয়, মানটি colorScheme থেকে নেওয়া হয়, যা iOS সেটিংসে থিম পরিবর্তন করার সময় স্বচালিতভাবে পরিবর্তিত হয়। প্যারেন্ট View (ContentView) .environment() মডিফায়ারের মাধ্যমে appTheme মান সেট করে।
struct ModalView: View {
@Environment(\.dismiss) var dismiss
@State private var name = ""
var body: some View {
NavigationStack {
Form {
TextField("Your name", text: $name)
Button("Save") { dismiss() }
}
.navigationTitle("Edit Profile")
}
}
}
এই উদাহরণটি dismissএর ব্যবহারিক ব্যবহার প্রদর্শন করে — পরিবেশ থেকে DismissAction-এর একটি উদাহরণ। একটি ফাংশন হিসাবে dismiss() কল করা মোডাল স্ক্রিন বন্ধ করে বা NavigationLink ফিরিয়ে দেয়। একমাত্র শর্ত হল View টিকে মোডালভাবে উপস্থাপিত হতে বা NavigationStack-এর মধ্যে থাকতে হবে। dismiss স্বচালিতভাবে প্রসঙ্গ থেকে নির্ধারিত হয়: যদি View একটি sheet হিসাবে খোলা হয় — sheet বন্ধ হয়, যদি popover হিসাবে — popover বন্ধ হয়।
সাধারণ প্রশ্নাবলী
না, @Environment শুধু পড়ার জন্য। মান পরিবর্তন করতে, ObservableObject এর সাথে @EnvironmentObject বা @Binding ব্যবহার করুন। কাস্টম EnvironmentKeys-এ বিস্তারে setter থাকতে পারে, কিন্তু এর মাধ্যমে পরিবর্তন UI আপডেট ট্রিগার করে না — এটি প্রযুক্তিগতভাবে সম্ভব কিন্তু সুপারিশ করা হয় না।
@Binding সত্যের উৎস (State, StateObject, ObservableObject) এর সাথে একটি দ্বি-মুখী সংযোগ তৈরি করে। @Environment হল পদানুক্রমিক প্রসঙ্গ থেকে এক-মুখী পড়া। @Binding একটি চাইল্ড View-এ ডেটা প্রেরণের জন্য উপযুক্ত, @Environment — সিস্টম বা বৈশ্বিক সেটিংস অ্যাক্সেসের জন্য।
একটি স্থির defaultValue সহ EnvironmentKey প্রোটোকল বাস্তবায়ন করে এমন একটি গঠন সংজ্ঞায়িত করুন। পরে subscript[key] এর মাধ্যমে getter/setter ব্যবহার করে EnvironmentValues কে একটি বৈশিষ্ট্য দিয়ে বিস্তৃত করুন। নিবন্ধনের পরে, @Environment(\.yourKey) ব্যবহার করুন পড়ার জন্য এবং .environment(\.yourKey, value) সেট করার জন্য।
SwiftUI 50-এর বেশি সিস্টম মান প্রদান করে: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight এবং অন্যান্য। সম্পূর্ণ তালিকা EnvironmentValues ডকুমেন্টেশনে রয়েছে।
হ্যাঁ, @Environment Preview-এ কাজ করে, কিন্তু ডিফল্ট মান সিমুলেটর থেকে পার্থক্য হতে পারে। Preview-এ পরীক্ষার জন্য, Preview কোডে সরাসরি .environment() মডিফায়ার ব্যবহার করুন: ThemedView().environment(\.colorScheme, .dark). এটি বিভিন্ন পরিবেশ অবস্থা দৃশ্যভাবে যাচাই করার অনুমতি দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন