#savol
OOP va uning 4 asosiy prinsiplari ?
OOP (Object Oriented Programming) Obyektga yo'naltirilgan dasturlash - kodni modullarga bo'lish, qayta ishlashga moslashtirish, ko'dlarni kengaytirishga qulaylashtirishga yordam beradigan dasturlash paradigmasi.
1. 💥 Inkapsulyatsiya (Encapsulation) - class memberlarini yashirish va to'g'ridan-to'g'ri foydalanishni cheklash;
2. 💥 Abstraksiya (Abstraction) - Classning yoki funksyani soddalashtirish va ishlash jarayonini yashirish. Bu deyarli sklet vazifasida ishlaydi. Abstraksiya ichidagi funksyalar hight-level va ularning class ichidagi bodylari low-level funksiya deb ataladi.
3. 💥 Merosxorlik (Inheritance) - Bitta class boshqa classning xususyat va metodlarini meros qila olishi. Bunda merol olgan class CHILD CLASS meros bergan class esa PARENT CLASS deb ataladi.
4. 💥 Polimorfizm (Polymorphism) - Bir hil nomda har hil parametrdagi funksyalarning bo'lishi. Bu ikki hil overload va overrirde bo'ladi.
Overload - bir sinfda bir nomda har hil parametrdagi funksyalarni yozish
Override - meros qilib olingan classning metodlarini yangi classda o'zgartirib yozish.
Ushbu savol barcha interviewlarda beriladi. O'ylamanki foydasi tegib qoladi.
OOP va uning 4 asosiy prinsiplari ?
OOP (Object Oriented Programming) Obyektga yo'naltirilgan dasturlash - kodni modullarga bo'lish, qayta ishlashga moslashtirish, ko'dlarni kengaytirishga qulaylashtirishga yordam beradigan dasturlash paradigmasi.
1. 💥 Inkapsulyatsiya (Encapsulation) - class memberlarini yashirish va to'g'ridan-to'g'ri foydalanishni cheklash;
2. 💥 Abstraksiya (Abstraction) - Classning yoki funksyani soddalashtirish va ishlash jarayonini yashirish. Bu deyarli sklet vazifasida ishlaydi. Abstraksiya ichidagi funksyalar hight-level va ularning class ichidagi bodylari low-level funksiya deb ataladi.
3. 💥 Merosxorlik (Inheritance) - Bitta class boshqa classning xususyat va metodlarini meros qila olishi. Bunda merol olgan class CHILD CLASS meros bergan class esa PARENT CLASS deb ataladi.
4. 💥 Polimorfizm (Polymorphism) - Bir hil nomda har hil parametrdagi funksyalarning bo'lishi. Bu ikki hil overload va overrirde bo'ladi.
Overload - bir sinfda bir nomda har hil parametrdagi funksyalarni yozish
Override - meros qilib olingan classning metodlarini yangi classda o'zgartirib yozish.
Ushbu savol barcha interviewlarda beriladi. O'ylamanki foydasi tegib qoladi.
🔥4
#savol
Dartda kompilyatsiya (Compilation) turlari ?
Dart asosan ikkita asosiy kompilyatsiya usulini qo'llab-quvvatlaydi :
- AOT (Ahead-of-Time) - oldindan kompilyatsiya;
- JIT (Just-in-Time) - bajarish vaqtida kompilyatsiya;
AOT - kodni ishga tushishidan oldin optimallashtiradi va mashina tiliga o'giradi. Bu asosan Flutterda apk yoki ipa fayllarni chiqarishda ishlatiladi.
JIT - bu kod ishlashi davomida optimallashtiriladi va kompilyatsiya qilinadi. Bu asosan run yoki debug qilganda ishlaydi va Hot-reload orqali kodni qayta ishga tushurmay o'zgarishlari ko'rish mumkin va bu flutterning key feature bo'lib hizmat qiladi.
Hot Restart ham JIT da ishlar ekan
Dartda kompilyatsiya (Compilation) turlari ?
Dart asosan ikkita asosiy kompilyatsiya usulini qo'llab-quvvatlaydi :
- AOT (Ahead-of-Time) - oldindan kompilyatsiya;
- JIT (Just-in-Time) - bajarish vaqtida kompilyatsiya;
AOT - kodni ishga tushishidan oldin optimallashtiradi va mashina tiliga o'giradi. Bu asosan Flutterda apk yoki ipa fayllarni chiqarishda ishlatiladi.
JIT - bu kod ishlashi davomida optimallashtiriladi va kompilyatsiya qilinadi. Bu asosan run yoki debug qilganda ishlaydi va Hot-reload orqali kodni qayta ishga tushurmay o'zgarishlari ko'rish mumkin va bu flutterning key feature bo'lib hizmat qiladi.
updated
Hot Restart ham JIT da ishlar ekan
#savol
Nega flutter 3 layoutga bo'lingan widget, element, render tree ?
- Bu bo'linish fluttering samarador ishlashi va UI yangilanishlarni optimallashtirishga yordam beradi. Har biri bilan qisqacha:
Widget tree (WT) - dasturchi tomondan yoziladigan barcha kodlar bo'lib UI tuzulishni ifodalaydi, bunda UI mavjud yoki mavjudmasligi bilinmaydi. build() metodi chaqirilganda har doim yangi widget hosil qilinadi. WT faqat deklarativ bo'lib, UI ning haqiqiy holatini saqlamaydi.
Element tree(ET) - WT ning real ishlov berilgan versiyasi, bunda flutter qaysi widgetlar mavjud va qanday bog'langanligini aniqlaydi.
- ET WT va Render tree (RT) o'rtasida ko'prik vazifasini bajaradi; - UI ning stateini saqlaydi;
- statelessElement va StatefulElement obyektlari mavjud;
- agar build() chaqirilsa, WT yangilanadi lekin faqat kerakli qismlar ET da o'zgaradi;
- kerakli qismlarni eslab qolishi va qayta ishlatishi mumkin;
❓ Nega kerak ? Agar har safar butun UI qayta chizilsa, u juda sekin ishlaydi. Element Tree esa faqat kerakli qismlarni o‘zgartirishga imkon beradi, bu esa samaradorlikni oshiradi.
Render tree (RT) - ekranda ko'ringan haqiqiy UI qismlarni hosil qiladi va chizadi;
- UI ning fizik tasvirlarini saqlaydi (size, position, paint);
- RenderObject larni boshqaradi ;
- Flutter SKIA orqali GPU yordamida RT elmentlarini ekranga chizadi;
❓Nega kerak ? RT UI ni qanday chiziqsh kerakligini optimallashtiradi va keraksiz qayta chizishlarni oldini oladi;
⚠️ Hot reload qilganda WT qayta yangilandi lekin ET va RT o'zgarishlarni minimallashtiradi;
Nega flutter 3 layoutga bo'lingan widget, element, render tree ?
- Bu bo'linish fluttering samarador ishlashi va UI yangilanishlarni optimallashtirishga yordam beradi. Har biri bilan qisqacha:
Widget tree (WT) - dasturchi tomondan yoziladigan barcha kodlar bo'lib UI tuzulishni ifodalaydi, bunda UI mavjud yoki mavjudmasligi bilinmaydi. build() metodi chaqirilganda har doim yangi widget hosil qilinadi. WT faqat deklarativ bo'lib, UI ning haqiqiy holatini saqlamaydi.
Element tree(ET) - WT ning real ishlov berilgan versiyasi, bunda flutter qaysi widgetlar mavjud va qanday bog'langanligini aniqlaydi.
- ET WT va Render tree (RT) o'rtasida ko'prik vazifasini bajaradi; - UI ning stateini saqlaydi;
- statelessElement va StatefulElement obyektlari mavjud;
- agar build() chaqirilsa, WT yangilanadi lekin faqat kerakli qismlar ET da o'zgaradi;
- kerakli qismlarni eslab qolishi va qayta ishlatishi mumkin;
❓ Nega kerak ? Agar har safar butun UI qayta chizilsa, u juda sekin ishlaydi. Element Tree esa faqat kerakli qismlarni o‘zgartirishga imkon beradi, bu esa samaradorlikni oshiradi.
Render tree (RT) - ekranda ko'ringan haqiqiy UI qismlarni hosil qiladi va chizadi;
- UI ning fizik tasvirlarini saqlaydi (size, position, paint);
- RenderObject larni boshqaradi ;
- Flutter SKIA orqali GPU yordamida RT elmentlarini ekranga chizadi;
❓Nega kerak ? RT UI ni qanday chiziqsh kerakligini optimallashtiradi va keraksiz qayta chizishlarni oldini oladi;
⚠️ Hot reload qilganda WT qayta yangilandi lekin ET va RT o'zgarishlarni minimallashtiradi;
#savol
Widget lifecycle ni hamma biladi lekin Element lifecycle nima ?
Element lifecycle quydagicha ishlaydi:
1️⃣ createElement() – widget birinchi martta chizilganda flutter ushubu metodni chaqiradi va widget uchun yangi element hosil qiladi;
2️⃣ mount() – element yaratilgach, u element tree ga qo'shiladi, agar statefulElement bo'lsa initState() chaqiriladi;
3️⃣ update() – agar setState() chaqirilsa yoki o'rniga boshqa o'xshash widget kelsa ushbu metod chaqiriladi. Bunda flutter widget tree ning eski va yangi versiyasini solishtiradi:
- agar widget o'zgarmagan bo'lsa elementni qayta ishlatadi;
- agar widget o'zgargan bo'lsa update() ni chaqiradi;
- agar turlar har hil bo'lsa (ya'ni Text o'rniga Container) unmount() -> createElement() ishlaydi;
4️⃣ deactivate() – agar widget WT dan olib tashlansa va qayta ishlatilishi mumkin bo'lsa ushbu metod chaqiriladi;
❓Qachon ishlaydi ? agar widget key bilan ishlatilgan bo'lsa flutter uni saqlaydi va qayta ishlatadi. Masalan ListView.builder() dagi elementlar deactivate bo'lib qayta ishlatiladi;
5️⃣ unmount() – agar element kerak bo'lmasa flutter ushnu metodni chaqiradi va uni butunlay o'chirib tashlaydi; dispose() oxirgi chaqiriladigan metod bo'lib barcha resuslarni tozalaydi va xotirani bo'shatadi;
Element Lifecycle haqida Qiziqarli Faktlar
✅ Element UI ning haqiqiy holatini saqlaydi, Widget esa faqat deklarativ UI modelidir.
✅ StatelessWidget har safar yangidan yaratiladi, lekin Element qayta ishlatilishi mumkin.
✅ dispose() har doim unmount() chaqirilishidan oldin chaqiriladi.
✅ ListView.builder() kabi widgetlar Element va RenderObjectlarni qayta ishlatadi, bu esa samaradorlikni oshiradi;
Widget lifecycle ni hamma biladi lekin Element lifecycle nima ?
Element lifecycle quydagicha ishlaydi:
1️⃣ createElement() – widget birinchi martta chizilganda flutter ushubu metodni chaqiradi va widget uchun yangi element hosil qiladi;
2️⃣ mount() – element yaratilgach, u element tree ga qo'shiladi, agar statefulElement bo'lsa initState() chaqiriladi;
3️⃣ update() – agar setState() chaqirilsa yoki o'rniga boshqa o'xshash widget kelsa ushbu metod chaqiriladi. Bunda flutter widget tree ning eski va yangi versiyasini solishtiradi:
- agar widget o'zgarmagan bo'lsa elementni qayta ishlatadi;
- agar widget o'zgargan bo'lsa update() ni chaqiradi;
- agar turlar har hil bo'lsa (ya'ni Text o'rniga Container) unmount() -> createElement() ishlaydi;
4️⃣ deactivate() – agar widget WT dan olib tashlansa va qayta ishlatilishi mumkin bo'lsa ushbu metod chaqiriladi;
❓Qachon ishlaydi ? agar widget key bilan ishlatilgan bo'lsa flutter uni saqlaydi va qayta ishlatadi. Masalan ListView.builder() dagi elementlar deactivate bo'lib qayta ishlatiladi;
5️⃣ unmount() – agar element kerak bo'lmasa flutter ushnu metodni chaqiradi va uni butunlay o'chirib tashlaydi; dispose() oxirgi chaqiriladigan metod bo'lib barcha resuslarni tozalaydi va xotirani bo'shatadi;
Element Lifecycle haqida Qiziqarli Faktlar
✅ Element UI ning haqiqiy holatini saqlaydi, Widget esa faqat deklarativ UI modelidir.
✅ StatelessWidget har safar yangidan yaratiladi, lekin Element qayta ishlatilishi mumkin.
✅ dispose() har doim unmount() chaqirilishidan oldin chaqiriladi.
✅ ListView.builder() kabi widgetlar Element va RenderObjectlarni qayta ishlatadi, bu esa samaradorlikni oshiradi;
👍2
#savol
Flutterda Platform Channellar ?
- Flutterda Platform Channellar flutter ilovalari va native (Android va iOS) o'rtasida aloqa o'rnatish uchun ishlatiladi. Bu bilan Dart qismidan Androidning Kotlin/Java, iOS'ning esa Swift/Objectiv-C qismiga so'rov jo'natish va javob olish mumkin.
Platform Channellar 3 ga bo'linadi:
1. Method Channel - Bir marttalik so'rov berish va javob qabul qilish uchun ishlatiladi. Flutter native qismga so'rov jo'natadi va protses qilingan datani qaytib oladi;
2. Event Channel - native qismdan flutter codega malumotlarni doimiy ravishda uzatish uchun ishlatiladi. Bu native tomondan dart qismga bir tomonlama chanel yaratadi va dart qismga event yoki oqimni asinxron tarzda jo'natishga yordam beradi. Bu native tomondan doimiy tarzda sensor malumot, wi-fi holati yoki shunga o'xshash doimiy uzatiladigan data uchun ishlatiladi;
3. BasicMessageChannel - Dart va native kod o'rtasida ikki tomonlama asinxron messagelarni jo'natish va qabul qilish uchun ishlatiladi. Bu doimiy ravishda ikki tomonlama malumot almashish uchun ishlatiladi.
Flutterda Platform Channellar ?
- Flutterda Platform Channellar flutter ilovalari va native (Android va iOS) o'rtasida aloqa o'rnatish uchun ishlatiladi. Bu bilan Dart qismidan Androidning Kotlin/Java, iOS'ning esa Swift/Objectiv-C qismiga so'rov jo'natish va javob olish mumkin.
Platform Channellar 3 ga bo'linadi:
1. Method Channel - Bir marttalik so'rov berish va javob qabul qilish uchun ishlatiladi. Flutter native qismga so'rov jo'natadi va protses qilingan datani qaytib oladi;
2. Event Channel - native qismdan flutter codega malumotlarni doimiy ravishda uzatish uchun ishlatiladi. Bu native tomondan dart qismga bir tomonlama chanel yaratadi va dart qismga event yoki oqimni asinxron tarzda jo'natishga yordam beradi. Bu native tomondan doimiy tarzda sensor malumot, wi-fi holati yoki shunga o'xshash doimiy uzatiladigan data uchun ishlatiladi;
3. BasicMessageChannel - Dart va native kod o'rtasida ikki tomonlama asinxron messagelarni jo'natish va qabul qilish uchun ishlatiladi. Bu doimiy ravishda ikki tomonlama malumot almashish uchun ishlatiladi.
#savol
Flutter arxitekturasi qanday ?
- Flutter arxitekturasi uch qismga bo'linadi:
1. Flutter Framework;
2. Flutter Engine;
3. Embedder (Platform Specific Code);
Va bularning o'z vazifasi bor :
1. Flutter Framework (Dart)
Flutter-ning yuqori darajadagi qismi bo‘lib, u Dart tilida yozilgan. Asosan uchta qatlamdan iborat:
• Material/Cupertino → UI komponentlari (Material yoki Cupertino vidjetlari).
• Widgets → Flutter-ning UI qurish uchun ishlatiladigan asosiy qatlami. Stateless va Stateful Widget-lar shu yerda joylashgan.
• Rendering, Gestures, Animation → UI ni chizish, animatsiyalar va foydalanuvchi harakatlariga javob berish.
2. Flutter Engine (C/C++)
Bu Flutter-ning “dvigateli”. Ushbu qism:
• Impeller grafik kutubxonasi yordamida UI ni chizadi.
• Dart kodini nativeda ishlashga aylantiradi (Dart VM yoki AOT - Ahead of Time Compilation orqali).
• Animatsiyalar va shriftda ishlashni optimallashtiradi.
3. Embedder (Platform Specific Code)
Bu qism Flutter ilovasini Android yoki iOS kabi platformalarda ishlashiga moslashtiradi.
• Android → MainActivity.kt yoki MainActivity.java (Kotlin/Java).
• iOS → AppDelegate.swift yoki AppDelegate.m (Swift/Objective-C).
• Linux, macOS, Windows → Tegishli native kodlar bilan ishlaydi.
Flutter Engine va Embedder birgalikda Flutter ilovasini platformada ishga tushirishga yordam beradi.
Flutter arxitekturasi qanday ?
- Flutter arxitekturasi uch qismga bo'linadi:
1. Flutter Framework;
2. Flutter Engine;
3. Embedder (Platform Specific Code);
Va bularning o'z vazifasi bor :
1. Flutter Framework (Dart)
Flutter-ning yuqori darajadagi qismi bo‘lib, u Dart tilida yozilgan. Asosan uchta qatlamdan iborat:
• Material/Cupertino → UI komponentlari (Material yoki Cupertino vidjetlari).
• Widgets → Flutter-ning UI qurish uchun ishlatiladigan asosiy qatlami. Stateless va Stateful Widget-lar shu yerda joylashgan.
• Rendering, Gestures, Animation → UI ni chizish, animatsiyalar va foydalanuvchi harakatlariga javob berish.
2. Flutter Engine (C/C++)
Bu Flutter-ning “dvigateli”. Ushbu qism:
• Impeller grafik kutubxonasi yordamida UI ni chizadi.
• Dart kodini nativeda ishlashga aylantiradi (Dart VM yoki AOT - Ahead of Time Compilation orqali).
• Animatsiyalar va shriftda ishlashni optimallashtiradi.
3. Embedder (Platform Specific Code)
Bu qism Flutter ilovasini Android yoki iOS kabi platformalarda ishlashiga moslashtiradi.
• Android → MainActivity.kt yoki MainActivity.java (Kotlin/Java).
• iOS → AppDelegate.swift yoki AppDelegate.m (Swift/Objective-C).
• Linux, macOS, Windows → Tegishli native kodlar bilan ishlaydi.
Flutter Engine va Embedder birgalikda Flutter ilovasini platformada ishga tushirishga yordam beradi.
#savol
Ushbu dart code run qilingach nima bo'ladi ?
- Avvalambor hashCode nima ekanini ko'ramiz - Dartda har bir obektning hashCode bo'lib, u obektning identifikatsiya yoki kontentini ifodalovchi butun son hisoblanadi. U Set va Map collectionlarda lookuplar tezligni oshirish uchun ishlatiladi.
- interger'lar uchun hashCode ularning qiymatiga teng;
- string'lar uchun esa Dart hashing funksyalarni ishlatadi;
demak quyidagicha javob olish mumkin:
Ushbu dart code run qilingach nima bo'ladi ?
- Avvalambor hashCode nima ekanini ko'ramiz - Dartda har bir obektning hashCode bo'lib, u obektning identifikatsiya yoki kontentini ifodalovchi butun son hisoblanadi. U Set va Map collectionlarda lookuplar tezligni oshirish uchun ishlatiladi.
- interger'lar uchun hashCode ularning qiymatiga teng;
- string'lar uchun esa Dart hashing funksyalarni ishlatadi;
demak quyidagicha javob olish mumkin:
12345
12345
12345
123456712345 // "12345" string uchun chiqishi mumkin bo'lgan hashCode;
123456712345
123456712345
#savol
Flutterda KEY lar qaysilar va nima vazifani bajaradi ?
Flutterda KEY — bu widgetlarni identifikatsiya qilish va ularning holatini boshqarish uchun ishlatiladigan maxsus obyekt.
Key asosan:
1. Widgetlarni identifikatsiya qilish – Agar bir xil turdagi bir nechta widget bo‘lsa, Flutter ularni Key yordamida ajratib oladi.
2. Holatni saqlash (State Preservation) – StatefulWidget lar qayta qurilganida, ularning oldingi holatini yo‘qotmasligi uchun Key ishlatiladi.
3. Animatsiyalar va o‘tishlar (Transitions) – Key yordamida widgetlar orasida silliq animatsiyalar amalga oshiriladi.
4. ListView, GridView va boshqa ro‘yxatlar bilan ishlash – Key ro‘yxat elementlarini aniq aniqlash va optimallashtirish uchun ishlatiladi.
Key'ning turlari:
1️⃣ ValueKey - bu kalit qiymat asosida yaratiladi. Agar qiymat o‘zgarmasa, Flutter widgetni qayta yaratmaydi.
2️⃣ ObjectKey - bu kalit obyektlar orqali ishlaydi. Obyektning hashCode yoki == operatori orqali solishtiriladi.
3️⃣ UniqueKey -bu har safar yangi kalit yaratadi va widgetni har doim yangilashga majbur qiladi.
☝️ Eslatma: UniqueKey bir xil widgetlar uchun har safar yangi identifikator yaratib, ularning qayta ishlatilishiga yo‘l qo‘ymaydi.
4️⃣ GlobalKey - bu StatefulWidget lar uchun eng kuchli Key bo‘lib, u nafaqat widgetni identifikatsiya qiladi, balki uning State obyektiga ham murojaat qilish imkonini beradi.
📌 Key larni noto‘g‘ri ishlatish ortiqcha resurs sarfiga olib kelishi mumkin. Eng yaxshi usul – faqat kerakli joylarda ishlatish.
Flutterda KEY lar qaysilar va nima vazifani bajaradi ?
Flutterda KEY — bu widgetlarni identifikatsiya qilish va ularning holatini boshqarish uchun ishlatiladigan maxsus obyekt.
Key asosan:
1. Widgetlarni identifikatsiya qilish – Agar bir xil turdagi bir nechta widget bo‘lsa, Flutter ularni Key yordamida ajratib oladi.
2. Holatni saqlash (State Preservation) – StatefulWidget lar qayta qurilganida, ularning oldingi holatini yo‘qotmasligi uchun Key ishlatiladi.
3. Animatsiyalar va o‘tishlar (Transitions) – Key yordamida widgetlar orasida silliq animatsiyalar amalga oshiriladi.
4. ListView, GridView va boshqa ro‘yxatlar bilan ishlash – Key ro‘yxat elementlarini aniq aniqlash va optimallashtirish uchun ishlatiladi.
Key'ning turlari:
1️⃣ ValueKey - bu kalit qiymat asosida yaratiladi. Agar qiymat o‘zgarmasa, Flutter widgetni qayta yaratmaydi.
Widget myWidget = Container(key: ValueKey('my_key'), child: Text("Salom"));
2️⃣ ObjectKey - bu kalit obyektlar orqali ishlaydi. Obyektning hashCode yoki == operatori orqali solishtiriladi.
class User {
final String name;
User(this.name);
}
User user = User('Isroiljon');
Widget myWidget = Container(key: ObjectKey(user), child: Text(user.name));
3️⃣ UniqueKey -bu har safar yangi kalit yaratadi va widgetni har doim yangilashga majbur qiladi.
Widget myWidget = Container(key: UniqueKey(), child: Text("Salom"));
☝️ Eslatma: UniqueKey bir xil widgetlar uchun har safar yangi identifikator yaratib, ularning qayta ishlatilishiga yo‘l qo‘ymaydi.
4️⃣ GlobalKey - bu StatefulWidget lar uchun eng kuchli Key bo‘lib, u nafaqat widgetni identifikatsiya qiladi, balki uning State obyektiga ham murojaat qilish imkonini beradi.
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
Form(
key: formKey,
child: TextFormField(
validator: (value) => value!.isEmpty ? "Majburiy maydon" : null,
),
);
📌 Key larni noto‘g‘ri ishlatish ortiqcha resurs sarfiga olib kelishi mumkin. Eng yaxshi usul – faqat kerakli joylarda ishlatish.
#savol
Object va dynamic turlarning farqi nima ?
🔽 Object - Dart tilida barcha obyektlar ushbu klasdan meros oladi.
- barcha turlar (int, string, bool, List, Map va barchasi) Object klasidan kelib chiqadi;
- object klasida e'lon qilingan barcha o'zgaruvchilar Object'ning umumiy metodlari bilan ishlay oladi;
- object o'zgaruvchilar compile timeda tekshiriladi va xatoliklarni aniqlaydi;
- agar o'zgaruvchining tur metodlari bilan ishlamoqchi bo'lsangiz cast qilishingizga to'g'ri keldi;
- to'g'ridan to'g'ri null qiymat olmaydi buning uchun nullable qilishingiz kerak ya'ni Object?;
🔽 dynamic - barcha turdagi qiymatlarni qabul qilishi mumkin;
- tekshiruvlar runtime'da amalga oshiriladi;
- runtime check bo'lgani uchun ishlatish havfsiz emas ya'ni runtime error chiqish ehtimoli katta;
- o'zgaruvchining metodlariga kirish mumkin lekin noto'g'ri bo'lsa ya'na runtime error olasiz 😅;
✅ Runtime error lardan bilan yuzlashishni hohlamasangiz Object dan foydalangan maqulroq.
Object va dynamic turlarning farqi nima ?
🔽 Object - Dart tilida barcha obyektlar ushbu klasdan meros oladi.
- barcha turlar (int, string, bool, List, Map va barchasi) Object klasidan kelib chiqadi;
- object klasida e'lon qilingan barcha o'zgaruvchilar Object'ning umumiy metodlari bilan ishlay oladi;
- object o'zgaruvchilar compile timeda tekshiriladi va xatoliklarni aniqlaydi;
- agar o'zgaruvchining tur metodlari bilan ishlamoqchi bo'lsangiz cast qilishingizga to'g'ri keldi;
- to'g'ridan to'g'ri null qiymat olmaydi buning uchun nullable qilishingiz kerak ya'ni Object?;
🔽 dynamic - barcha turdagi qiymatlarni qabul qilishi mumkin;
- tekshiruvlar runtime'da amalga oshiriladi;
- runtime check bo'lgani uchun ishlatish havfsiz emas ya'ni runtime error chiqish ehtimoli katta;
- o'zgaruvchining metodlariga kirish mumkin lekin noto'g'ri bo'lsa ya'na runtime error olasiz 😅;
✅ Runtime error lardan bilan yuzlashishni hohlamasangiz Object dan foydalangan maqulroq.
#savol
Dart'da pattern matching nima ?
Pattern matching - bu o‘zgaruvchilarni aniqlash, shartlarni tekshirish va ma’lumotlarni ajratib olish (destructuring) uchun ishlatiladigan qulay usul. U Dart 3 versiyasidan boshlab qo‘llab-quvvatlanadi va switch operatorida yoki if-case bloklarida ishlatiladi.
1️⃣ Oddit pattern matching (switch bilan) :
2️⃣ Destructuring (recordlar bilan):
bu yerda pattern matching yordamida tuple (Record) qiymatlari ajratib olindi.
3️⃣ if-case bilan pattern matching:
4️⃣ Pattern Matching bilan JSON-like obyektlarni ajratish
case {'name': String name, 'age': int age} – JSON (Map) ichidagi qiymatlarni ajratib oladi.
Dart'da pattern matching nima ?
Pattern matching - bu o‘zgaruvchilarni aniqlash, shartlarni tekshirish va ma’lumotlarni ajratib olish (destructuring) uchun ishlatiladigan qulay usul. U Dart 3 versiyasidan boshlab qo‘llab-quvvatlanadi va switch operatorida yoki if-case bloklarida ishlatiladi.
1️⃣ Oddit pattern matching (switch bilan) :
void checkValue(Object value) {
switch (value) {
case int n:
print('Bu butun son: $n');
break;
case String s:
print('Bu string: $s');
break;
default:
print('Noma’lum tur');
}
}
void main() {
checkValue(42); // Bu butun son: 42
checkValue("Salom"); // Bu string: Salom
}
2️⃣ Destructuring (recordlar bilan):
(String, int) getUser() {
return ('Isroiljon', 25);
}
void main() {
var (name, age) = getUser();
print('Ism: $name, Yoshi: $age'); // Ism: Isroiljon, Yoshi: 25
}
bu yerda pattern matching yordamida tuple (Record) qiymatlari ajratib olindi.
3️⃣ if-case bilan pattern matching:
void checkType(Object obj) {
if (obj case int n) {
print('Bu butun son: $n');
} else if (obj case String s) {
print('Bu string: $s');
} else {
print('Noma’lum tur');
}
}
void main() {
checkType(100); // Bu butun son: 100
checkType('Hello'); // Bu string: Hello
}
4️⃣ Pattern Matching bilan JSON-like obyektlarni ajratish
void checkUser(Map<String, dynamic> user) {
switch (user) {
case {'name': String name, 'age': int age}:
print('Ism: $name, Yoshi: $age');
break;
default:
print('Noto‘g‘ri formatdagi user');
}
}
void main() {
var user = {'name': 'Isroiljon', 'age': 25};
checkUser(user); // Ism: Isroiljon, Yoshi: 25
}
case {'name': String name, 'age': int age} – JSON (Map) ichidagi qiymatlarni ajratib oladi.
#savol
Dartda static hamda dynamic listlarning farqi nimada ?
- Ularing asosiy farqi type safety'sida. Ya'ni
static listlar - compile-time type check bo'ladi, performance va code safety uchun ham ancha qulay;
dynamic listlar - ixtiyoriy type'ni qabul qilishi mumkin, compile-time emas balki runtime'da va hatoliklar chiqish ehtimoli juda katta, qulay lekin havfli.
Endi ular xotirada qanday joylashishi haqida gaplashadigan bo'lsak:
static list - type aniqligi hisobiga xotiradan bir hilda joy ajratadi, dart vm (JIT yoki AOT) vaqtida ham bu type aniq bo'ladi, joylash va o'qish tez chunki hech qanday type checking shart emas.
dynamic list - har bir elementning reference saqlanadi, VM qo'shimcha qanday typeligi va qayerda joylashgani haqida metadata saqlaydi, sekin o'qiladi chunki runtime type checking bor, shular sabab xotiraga yuklama ko'p tushadi.
Shuning uchun har doim o'zgaruvchi type'ini aniq berib ketish tavsiya etiladi.
Dartda static hamda dynamic listlarning farqi nimada ?
- Ularing asosiy farqi type safety'sida. Ya'ni
static listlar - compile-time type check bo'ladi, performance va code safety uchun ham ancha qulay;
dynamic listlar - ixtiyoriy type'ni qabul qilishi mumkin, compile-time emas balki runtime'da va hatoliklar chiqish ehtimoli juda katta, qulay lekin havfli.
Endi ular xotirada qanday joylashishi haqida gaplashadigan bo'lsak:
static list - type aniqligi hisobiga xotiradan bir hilda joy ajratadi, dart vm (JIT yoki AOT) vaqtida ham bu type aniq bo'ladi, joylash va o'qish tez chunki hech qanday type checking shart emas.
dynamic list - har bir elementning reference saqlanadi, VM qo'shimcha qanday typeligi va qayerda joylashgani haqida metadata saqlaydi, sekin o'qiladi chunki runtime type checking bor, shular sabab xotiraga yuklama ko'p tushadi.
Shuning uchun har doim o'zgaruvchi type'ini aniq berib ketish tavsiya etiladi.
👍5🔥1
#savol
Agar MediaQuery yoki Theme propertylarni context orqali initState() method ichida olishga urunilsa throw beriladi. Biz buni hali initState()'da context tayyor bo'lmagani bilan bog'laymiz. Lekin bloc'larni context orqali o'qiganimizda xatolik bermaydi. Nima uchun deb o'ylaysizlar ?
Agar MediaQuery yoki Theme propertylarni context orqali initState() method ichida olishga urunilsa throw beriladi. Biz buni hali initState()'da context tayyor bo'lmagani bilan bog'laymiz. Lekin bloc'larni context orqali o'qiganimizda xatolik bermaydi. Nima uchun deb o'ylaysizlar ?