Published on

@Environment — ilova miqyosidagi qiymatlarni o’qish

Authors

Ilovangizdagi ba'zi ma'lumotlar faqat bitta bola view-ga emas, balki hamma joyda ochiq bo'lishi kerak. Masalan, tizimning joriy rang sxemasi — light yoki dark mode (yorug'lik yoki qorong'ulik rejimi). Ilovadagi har bir view buni bilishni xohlashi mumkin va buni har bir view-ga parametr sifatida uzatib chiqish juda mashaqqatli ish bo'lar edi. Environment (muhit) — bu ierarxiyadagi har qanday view kirib o'qishi mumkin bo'lgan umumiy qiymatlar xaltasidir.

Avvalgi (@Binding va @Observable) darslarida siz ma'lumotlarni ochiq tarzda (explicitly) uzatdingiz — yo bindings yordamida, yoki model nusxasini parametr orqali berib. Environment boshqacha ishlaydi: u har bir oraliq view-ga qo'lda ulashni talab qilmasdan, butun view ierarxiyasi bo'ylab avtomatik ravishda pastga oqadi. Shuningdek, view'lar o'z avlodlariga (descendants) foydalanishi uchun environment'ga o'z qiymatlarini ham kiritishi mumkin.

Ushbu darsning oxirida siz colorScheme, dismiss va locale kabi umumiy o'rnatilgan environment qiymatlarini qanday o'qishni va environment-ning SwiftUI ma'lumotlar oqimidagi rolini tushunib olasiz.

O'rnatilgan (built-in) Environment qiymatlarini o'qish

Mana environment-dan yorug'lik/qorong'ulik rejimini o'qish misoli:

Swift
AppearanceAwareView.swift
import SwiftUI struct AppearanceAwareView: View { @Environment(\.colorScheme) var colorScheme var body: some View { VStack(spacing: 16) { Text(colorScheme == .dark ? "Qorong'i rejim faol" : "Yorug' rejim faol") .font(.title2) Image(systemName: colorScheme == .dark ? "moon.fill" : "sun.max.fill") .font(.largeTitle) .foregroundStyle(colorScheme == .dark ? .white : .orange) } .padding() } }
Kod / SatrVazifasi
@Environment(\.colorScheme) var colorSchemeSwiftUI environment-idan colorScheme qiymatini o'qiydi. Backslash belgisi bilan boshlanadigan yozuv (\.colorScheme) key path (kalit yo'li) deb ataladi — u qaysi muhit qiymatini o'qimoqchi ekanligingizni bildiradi.
colorScheme == .darkMuhit qiymatini ColorScheme enum-ining .dark holati bilan taqqoslaydi. Foydalanuvchi tizim rejimini o'zgartirganda, ushbu view avtomatik ravishda qayta chiziladi.

Tez-tez ishlatiladigan Environment qiymatlari

.dismiss (Sheet yoki navigation destination-ni yopish)

struct SozlamalarSheet: View {
    // dismiss - bu harakat (action). Uni chaqirish joriy view-ni yopadi
    @Environment(\.dismiss) var dismiss

    var body: some View {
        Button("Tayyor") {
            // dismiss() chaqirilishi ushbu sheet-ni yopadi — binding kerak emas
            dismiss()
        }
    }
}

dismiss — bu qiymat emas, balki harakatdir. Uni funksiya kabi chaqirasiz. U SwiftUI-ga ushbu view joylashgan konteynerni (sheet, fullscreen cover yoki navigation push bo'lishidan qat'i nazar) yopishni aytadi. Bolaga yopish binding-ini uzatishdan ko'ra ancha toza yechim.

.locale (tizim tili va mintaqasini aniqlash)

struct TilKo'rinishi: View {
    @Environment(\.locale) var locale

    var body: some View {
        // locale.identifier "en_US", "uz_UZ" yoki "ru_RU" kabi qiymat qaytaradi
        Text("Sizning til: \(locale.identifier)")
    }
}

Foydalanuvchi hududiga qarab sanalar, sonlar yoki valyutalarni to'g'ri formatlash kerak bo'lganda foydali. SwiftUI-ning o'rnatilgan formatlovchilari (formatters) locale-ni avtomatik ishlatadi, lekin ko'proq nazorat kerak bo'lsa uni o'zingiz ham o'qishingiz mumkin.

.dynamicTypeSize (matn o'lchamlariga moslashish)

struct MoslashuvchanKo'rinish: View {
    @Environment(\.dynamicTypeSize) var typeSize

    var body: some View {
        // Matn o'lchamiga qarab maketni o'zgartirish — katta shrift ishlatuvchilar uchun boshqacha maket kerak bo'lishi mumkin
        if typeSize >= .accessibility1 {
            VStack { /* Katta matn uchun vertikal joylashuv */ }
        } else {
            HStack { /* Oddiy matn uchun yonma-yon joylashuv */ }
        }
    }
}

dynamicTypeSize qiymatini o'qish tizimda katta shrift o'rnatgan foydalanuvchilar uchun dizaynni moslashtirish imkonini beradi. Bu foydalanuvchilar qulayligi (accessibility) uchun juda muhim hisoblanadi.

.openURL (tashqi saytlarni ochish)

struct HavolalarKo'rinishi: View {
    // openURL - bu harakat. Uni URL bilan chaqirish saytni brauzerda ochadi
    @Environment(\.openURL) var openURL

    var body: some View {
        Button("SwiftUI.uz saytini ko'rish") {
            openURL(URL(string: "https://swiftui.uz")!)
        }
    }
}

dismiss kabi, openURL ham environment-dagi harakatdir. Chaqirilganda u URL-ni mos tizim ilovasida (odatda Safari brauzerida) ochadi.

Tezkor ma'lumotnoma

Environment kalitiNima taqdim etadi
\.colorSchemeJoriy yorug'lik/qorong'ulik rejimi (.light yoki .dark)
\.dismissJoriy sheet yoki navigatsiyani yopish harakati
\.localeFoydalanuvchining joriy til va mintaqasi
\.dynamicTypeSizeAccessibility sozlamalaridagi matn o'lchami
\.openURLURL manzillarini tegishli ilovada ochish harakati
\.isPresentedView hozirda ko'rsatilyaptimi yoki yo'qligini bildiruvchi Bool binding

Topshiriq: rejimga sezgir karta (theme-aware Card)

ThemeCard deb nomlangan view yarating, u environment-dan \.colorScheme-ni o'qisin. Tizim rejimiga qarab fon rangi va chegarasi o'zgaradigan RoundedRectangle chizing — yorug'lik (light) rejimida oq-och kulrang fon va qorong'i chegara, qorong'ulik (dark) rejimida esa to'q kulrang fon va och chegara bo'lsin. To'rtburchak ichida joriy rejim nomini yozib qo'ying. Xcode canvas preview qismida bir vaqtning o'zida yorug'lik va qorong'i rejimlarni yonma-yon ko'rish uchun "Color Scheme" variantidan foydalanib tekshiring.

Buy mea coffee