Flutterda "late" o'zgaruvchidan ehtiyot bo'ling.
Late kalit so'zi, o'zgaruvchiga keyinroq qiymat beraman degani, lekin bir qancha kamchiliklarga ega.
Qiymat berishda (initialization) kompilyatsiya vaqti tekshiruvi yo'q. Agar siz late o'zgaruvchini qiymat berishni unutib qo'ysangiz, buni faqat runtime-da, dastur ishlamay qolganda bilasiz. Bu null-safety-ning ko'plab nuqtalarini buzilishiga olib keladi.
Yuqori optimallashtirish darajalarida runtime tekshiruvlari o'tkazib yuboriladi. -O4 bayrog'i bilan qurishda late o'zgaruvchilarni tekshirish o'tkazib yuboriladi. Bu esa bunday xatolarni tuzatishni qiyinlashtiradi.
Ko'proq xotirani egallaydi.
Sizning dasturingiz late o'zgaruvchi qiymat berilganmi yoki yo'qligini bilishi kerak. Buning uchun kompilyator ko'pincha xotirani oladigan yashirin ichki o'zgaruvchini yaratadi.
Har bir o'qishdan oldin ortiqcha "if" ishlatish.
Late o'zgaruvchini har safar o'qiganingizda dastur uni ishga tushirishni ta'minlashi kerak, shuning uchun qo'shimcha tekshiruv qo'shiladi.
Har bir yozishdan oldin qo'shimcha yozish.
Har safar late o'zgaruvchiga qiymat berganingizda dastur ishga tushirilganligini qayd qilish uchun ichki bayroqchani o'rnatadi.
Late-dan to'g'ri foydalanish uchun batafsil : Link
#Flutter
Late kalit so'zi, o'zgaruvchiga keyinroq qiymat beraman degani, lekin bir qancha kamchiliklarga ega.
Qiymat berishda (initialization) kompilyatsiya vaqti tekshiruvi yo'q. Agar siz late o'zgaruvchini qiymat berishni unutib qo'ysangiz, buni faqat runtime-da, dastur ishlamay qolganda bilasiz. Bu null-safety-ning ko'plab nuqtalarini buzilishiga olib keladi.
Yuqori optimallashtirish darajalarida runtime tekshiruvlari o'tkazib yuboriladi. -O4 bayrog'i bilan qurishda late o'zgaruvchilarni tekshirish o'tkazib yuboriladi. Bu esa bunday xatolarni tuzatishni qiyinlashtiradi.
Ko'proq xotirani egallaydi.
Sizning dasturingiz late o'zgaruvchi qiymat berilganmi yoki yo'qligini bilishi kerak. Buning uchun kompilyator ko'pincha xotirani oladigan yashirin ichki o'zgaruvchini yaratadi.
Har bir o'qishdan oldin ortiqcha "if" ishlatish.
Late o'zgaruvchini har safar o'qiganingizda dastur uni ishga tushirishni ta'minlashi kerak, shuning uchun qo'shimcha tekshiruv qo'shiladi.
Har bir yozishdan oldin qo'shimcha yozish.
Har safar late o'zgaruvchiga qiymat berganingizda dastur ishga tushirilganligini qayd qilish uchun ichki bayroqchani o'rnatadi.
Late-dan to'g'ri foydalanish uchun batafsil : Link
#Flutter
👍2
Widgets vs Helper methods.
Alohida vidjetlar yoki yordamchi metodlardan foydalanishda ularning farqlarini tushunib olish juda muhim. Quyida ulardan bir nechtasini ko'rib chiqamiz :
Unumdorlik (performance).
Alohida vidjetlar samaraliroq, chunki ular har safar ulardagi biror qiymat o'zgarganda qayta quriladi (rebuild), yordamchi metodlar esa har safar ota vidjet o'zgarganda qayta quriladi.
Agar vidjet ichida setState metod chaqirilsa, uning butun build metodi qayta ishga tushiriladi. Bu UI-da kichik bir qismi o'z holatini o'zgartirganda, uning butun o'rab turgan vidjetini qayta ishga tushirilishini anglatadi, bu bizni keraksiz build metod chaqiruvlariga olib keladi.
Har bir build funksiya chaqiruvi, faqat vidjet daraxtini qayta qurishdan tashqari, Element tree va RenderObject tree-ni qayta build qilishga sabab bo'ladi. Shunday qilib, biz setState-ni qanchalik kam chaqirsak, Flutter bu daraxtlarni shunchalik kamroq qayta quradi va dastur ko'proq samarali bo'ladi.
Testlash imkoniyati (testability).
Alohida vidjetlarni testlash odatda osonroq, chunki ularni yordamchi metodlarga qaraganda osonroq ajratish mumkin.
Aniqlik (accuracy).
Kod alohida vidjetlarga ajratilganda uni boshqarish va tushunish osonroq bo'lishi mumkin, chunki u yagona javobgarlik (Single responsibility) tamoyiliga yaxshiroq amal qiladi.
Eski va yaroqsiz BuildContext-dan foydalanish imkoniyatini kamaytirish uchun har bir vidjet o'zining BuildContext-ga murojaat qilishi kerak. Boshqacha qilib aytganda, har bir vidjet faqat bitta BuildContext-ga kirish huquqiga ega bo'lishi kerak.
Manbalar :
1. Official video : Link
2. Medium : Link
#Flutter
Alohida vidjetlar yoki yordamchi metodlardan foydalanishda ularning farqlarini tushunib olish juda muhim. Quyida ulardan bir nechtasini ko'rib chiqamiz :
Unumdorlik (performance).
Alohida vidjetlar samaraliroq, chunki ular har safar ulardagi biror qiymat o'zgarganda qayta quriladi (rebuild), yordamchi metodlar esa har safar ota vidjet o'zgarganda qayta quriladi.
Agar vidjet ichida setState metod chaqirilsa, uning butun build metodi qayta ishga tushiriladi. Bu UI-da kichik bir qismi o'z holatini o'zgartirganda, uning butun o'rab turgan vidjetini qayta ishga tushirilishini anglatadi, bu bizni keraksiz build metod chaqiruvlariga olib keladi.
Har bir build funksiya chaqiruvi, faqat vidjet daraxtini qayta qurishdan tashqari, Element tree va RenderObject tree-ni qayta build qilishga sabab bo'ladi. Shunday qilib, biz setState-ni qanchalik kam chaqirsak, Flutter bu daraxtlarni shunchalik kamroq qayta quradi va dastur ko'proq samarali bo'ladi.
Testlash imkoniyati (testability).
Alohida vidjetlarni testlash odatda osonroq, chunki ularni yordamchi metodlarga qaraganda osonroq ajratish mumkin.
Aniqlik (accuracy).
Kod alohida vidjetlarga ajratilganda uni boshqarish va tushunish osonroq bo'lishi mumkin, chunki u yagona javobgarlik (Single responsibility) tamoyiliga yaxshiroq amal qiladi.
Eski va yaroqsiz BuildContext-dan foydalanish imkoniyatini kamaytirish uchun har bir vidjet o'zining BuildContext-ga murojaat qilishi kerak. Boshqacha qilib aytganda, har bir vidjet faqat bitta BuildContext-ga kirish huquqiga ega bo'lishi kerak.
Sinflar yaxshiroq standart xatti-harakat (behaviour)-ga ega, metodlarning yagona foydasi - biroz kamroq kod yozish holos. Boshqa hech qanday funksional foyda yo'q.
Remi Russelet.
Manbalar :
1. Official video : Link
2. Medium : Link
#Flutter
Flutterda Arxitektura naqshlari.
Arxitektura nega kerak ?
Ilovaning turli qismlari o'zaro bog'liqlikni kamaytiradigan turli jihatlar uchun javobgar bo'lishi taminlaydi. Arxitektura ilovani boshqarib bo'lmaydigan holga keltirmasdan o'sishiga imkon beradi. Komponentlarni testlash oson bo'lishi, bu esa ishonchli testlash strategiyalarini yaratishga imkon beradi. Kodni tushunish va o'zgartirish oson bo'ladi.
Provider.
State boshqaruvini soddalashtirish uchun InheritedWidget ustiga qurilgan. Foydalanish va integratsiya qilish oson va ortiqcha (boilerplate) kodni kamaytiradi.
Provider: Ilovani yoki vidjet daraxtining alohida qismlarini o‘rab oladi.
Consumer: Provayderni tinglaydi va holat (state) o'zgarganda qayta quradi (rebuild).
Riverpod.
State boshqaruvi kutubxonasi boʻlib, u Provayderning gʻoyalariga asoslanadi, ammo takomillashtirilgan. Provayderga nisbatan yaxshilangan testlash va modullilikga ega va state-ga kirishi uchun BuildContext zaruriyatini yo'q qiladi.
Redux.
JavaScript-dan moslashtirilgan dastur holatini boshqarish uchun bashorat qilinadigan holat konteyneridir. Ortiqcha kodning ko'payishi va murakkablik dastur hajmi o'sishiga olib kelishi mumkin.
Store: Ilova holati (state)-ni saqlaydi.
Actions: State-dagi o'zgarishlarni tasvirlab beradi.
Reducers: harakatlarga javoban state qanday o'zgarishini aniqlaydigan sof funksiyalar.
GetX.
Bu state boshqaruvi, qaramlilik (dependency injection) va route boshqarish uchun yaxlit yechimdir (barchasi birda). Barchasi birda bo'lgani, kodni minimallashgani va samarali bo'lishiga qaramay, GetX ekotizimiga qattiq bog'langan. Shu bilan birga kichik ilovalar uchun ortiqcha bo'lishi mumkin.
Controller: state va mantiqni boshqaradi.
GetBuilder: Controller holati o'zgarganda UI-ni qayta quradi.
GetX/Obx: Reaktiv holatni boshqarish vidjetlari.
MobX.
JavaScript dunyosidagi MobX tomonidan ilhomlangan reaktiv state boshqaruvi kutubxonasi. Oddiy, intuitiv va ortiqcha kodni kamaytiradi.
Observable: state-ni ifodalaydi.
Action: state-ni o'zgartiradi.
Reaction: state o'zgarganda UI-ni avtomatik ravishda yangilaydi.
BLoC (Business Logic Component).
State-ni boshqarish uchun oqim (stream)-lardan foydalangan holda reaktiv dasturlash tamoyillariga tayanadi.
Model: Ma'lumotlar tuzilmalarini ifodalaydi.
View: BLoC bilan o'zaro aloqada bo'lgan Flutter vidjetlari.
BLoC: Stream-larni va biznes mantig'ini boshqaradi.
Yuqori darajada testlash imkoni va kengaytirilishi mumkin. UI va biznes mantig'ini aniq ajratishni rag'batlantiradi. Dart-ning stream API-sidan foydalanadi. Yangi boshlovchilar uchun o'rganish qiyin bo'lishi va ortiqcha kod juda katta bo'lishi mumkin.
Manba : Link
#Flutter
Arxitektura nega kerak ?
Ilovaning turli qismlari o'zaro bog'liqlikni kamaytiradigan turli jihatlar uchun javobgar bo'lishi taminlaydi. Arxitektura ilovani boshqarib bo'lmaydigan holga keltirmasdan o'sishiga imkon beradi. Komponentlarni testlash oson bo'lishi, bu esa ishonchli testlash strategiyalarini yaratishga imkon beradi. Kodni tushunish va o'zgartirish oson bo'ladi.
Provider.
State boshqaruvini soddalashtirish uchun InheritedWidget ustiga qurilgan. Foydalanish va integratsiya qilish oson va ortiqcha (boilerplate) kodni kamaytiradi.
Provider: Ilovani yoki vidjet daraxtining alohida qismlarini o‘rab oladi.
Consumer: Provayderni tinglaydi va holat (state) o'zgarganda qayta quradi (rebuild).
Riverpod.
State boshqaruvi kutubxonasi boʻlib, u Provayderning gʻoyalariga asoslanadi, ammo takomillashtirilgan. Provayderga nisbatan yaxshilangan testlash va modullilikga ega va state-ga kirishi uchun BuildContext zaruriyatini yo'q qiladi.
Redux.
JavaScript-dan moslashtirilgan dastur holatini boshqarish uchun bashorat qilinadigan holat konteyneridir. Ortiqcha kodning ko'payishi va murakkablik dastur hajmi o'sishiga olib kelishi mumkin.
Store: Ilova holati (state)-ni saqlaydi.
Actions: State-dagi o'zgarishlarni tasvirlab beradi.
Reducers: harakatlarga javoban state qanday o'zgarishini aniqlaydigan sof funksiyalar.
GetX.
Bu state boshqaruvi, qaramlilik (dependency injection) va route boshqarish uchun yaxlit yechimdir (barchasi birda). Barchasi birda bo'lgani, kodni minimallashgani va samarali bo'lishiga qaramay, GetX ekotizimiga qattiq bog'langan. Shu bilan birga kichik ilovalar uchun ortiqcha bo'lishi mumkin.
Controller: state va mantiqni boshqaradi.
GetBuilder: Controller holati o'zgarganda UI-ni qayta quradi.
GetX/Obx: Reaktiv holatni boshqarish vidjetlari.
MobX.
JavaScript dunyosidagi MobX tomonidan ilhomlangan reaktiv state boshqaruvi kutubxonasi. Oddiy, intuitiv va ortiqcha kodni kamaytiradi.
Observable: state-ni ifodalaydi.
Action: state-ni o'zgartiradi.
Reaction: state o'zgarganda UI-ni avtomatik ravishda yangilaydi.
BLoC (Business Logic Component).
State-ni boshqarish uchun oqim (stream)-lardan foydalangan holda reaktiv dasturlash tamoyillariga tayanadi.
Model: Ma'lumotlar tuzilmalarini ifodalaydi.
View: BLoC bilan o'zaro aloqada bo'lgan Flutter vidjetlari.
BLoC: Stream-larni va biznes mantig'ini boshqaradi.
Yuqori darajada testlash imkoni va kengaytirilishi mumkin. UI va biznes mantig'ini aniq ajratishni rag'batlantiradi. Dart-ning stream API-sidan foydalanadi. Yangi boshlovchilar uchun o'rganish qiyin bo'lishi va ortiqcha kod juda katta bo'lishi mumkin.
Manba : Link
#Flutter
Flutter dastur versiyasi.
Hech ahamiyat berganmisiz, yangi dastur yaratganingizda, pubspec.yaml fayl ichida, dasturimizning dastlabki versiyasi quyidagicha bo'ladi:
Plus belgisidan chap tomondagi nuqta bilan ajratilgan 3 xonalik raqam bu versiya raqami, o'ng tomondagi esa build raqami.
Dasturimizning yangi versiyasini chiqarish uchun pubspec.yaml fayldan versiyani o'zgartirgandan so'ng, android uchun build qilish orqali, android fayl ichidagi local.properties fayldagi versiyalarni to'g'irlab olamiz.
Google Play dastur versionCode uchun ruhsat bergan limit : 2100000000.
Manba : Link
#Flutter
Hech ahamiyat berganmisiz, yangi dastur yaratganingizda, pubspec.yaml fayl ichida, dasturimizning dastlabki versiyasi quyidagicha bo'ladi:
version : 1.0.0+1
Plus belgisidan chap tomondagi nuqta bilan ajratilgan 3 xonalik raqam bu versiya raqami, o'ng tomondagi esa build raqami.
Dasturimizning yangi versiyasini chiqarish uchun pubspec.yaml fayldan versiyani o'zgartirgandan so'ng, android uchun build qilish orqali, android fayl ichidagi local.properties fayldagi versiyalarni to'g'irlab olamiz.
Google Play dastur versionCode uchun ruhsat bergan limit : 2100000000.
Manba : Link
#Flutter
👍2
Responsive vs Adaptive UI.
Responsive UI turli o'lchamlarga mos keladigan yagona tartib (layout)-ni saqlab, ekran o'lchamiga mos ravishda sozlanadi.
Adaptive UI har bir platformaning o'ziga xos xususiyatlaridan kelib chiqib, tajribani optimallashtiradigan turli qurilmalar uchun alohida layout-larni taqdim etadi.
Responsive UI qurish uchun paketlar : Link
Manbalar:
1. Official doc : Link
2. Medium : Link
3. GFG : Link
#Flutter
Responsive UI turli o'lchamlarga mos keladigan yagona tartib (layout)-ni saqlab, ekran o'lchamiga mos ravishda sozlanadi.
Adaptive UI har bir platformaning o'ziga xos xususiyatlaridan kelib chiqib, tajribani optimallashtiradigan turli qurilmalar uchun alohida layout-larni taqdim etadi.
Responsive UI qurish uchun paketlar : Link
Manbalar:
1. Official doc : Link
2. Medium : Link
3. GFG : Link
#Flutter
⚡2
Flutterda "hot-reload" ichki jarayonlari.
1. Hot Reload tugmasi bosilganda.
Qayta yuklash (hot-reload) boshlanganda, Flutter uskuna (tool)-laridagi HotRunner klassi boshqaruvni o'z qo'liga oladi. Ushbu sinf butun jarayonni tartibga solish uchun javobgardir.
HotRunner birinchi navbatda ilovaning hot-reload-ga ruhsat berilgan holatda ekanligini tekshiradi. U oxirgi kompilyatsiyadan keyin qaysi fayllar o'zgartirilganligini aniqlaydi. U "VM Service Protocol" yordamida Dart VM bilan bog'lanadi.
2. Manba kodini yangilash (Dart VM code injection).
Dart VM yangilangan kodni oladi va uni ishlaydigan dasturga kiritadi.
VM o'zgartirilgan kutubxonalarning yangi versiyalarini yaratadi. Yangilanishlarni samarali boshqarish uchun u "copy-on-write" mexanizmidan foydalanadi. Kodning eski versiyalari, agar kerak bo'lsa, ortga qaytishga ruxsat berish uchun xotirada saqlanadi.
3. JIT yordamida kodni kompilyatsiya qilish.
Dart VM-ning JIT kompilyatori yangi kodni tezda kompilyatsiya qiladi.
U optimallashtirish uchun ichki keshlash (inline caching) va "type feedback" usullardan foydalanadi. Kompilyator jarayonni tezlashtirish uchun avvalgi kompilyatsiyani iloji boricha qayta ishlatishga harakat qiladi.
4. Eski va yangi vidjet daraxtlarini solishtirish.
Flutter framework, yangilanishi kerak bo'lgan narsalarni aniqlash uchun eski vidjet daraxtini yangisi bilan taqqoslaydi.
Bu jarayon Flutterning vidjet va render obyektlari oʻrtasidagi moslashtirish qatlami boʻlgan Element tree-dan foydalanadi. U vidjet identifikatori va holatini saqlashni boshqara oladigan samarali farqlash algoritmidan foydalanadi.
5. Ta'sir qilingan vidjetlarni aniqlash va qayta tiklash.
Taqqoslash asosida Flutter qaysi vidjetlarni qayta qurish kerakligini aniqlaydi va ularni rekonstruksiya qilishni rejalashtiradi.
BuildOwner klassi bu jarayonni boshqaradi va qayta qurish kerak bo'lgan elementlar ro'yxatini saqlaydi. Joriy ilova holatini saqlab qolish uchun iloji boricha state obyektlari saqlanadi.
6. Xotira va axlat yig'ish (garbage collector)-ni boshqarish.
Qayta yuklash jarayonida Flutter oqish (leak)-ning oldini olish va silliq ishlashini ta'minlash uchun xotirani diqqat bilan boshqarishi kerak.
Dart VM axlat yig'uvchisi endi kerak bo'lmagan narsalarni tozalash uchun ishlaydi. Ramka xotira buzilishini minimallashtirish uchun mavjud ob'ektlarni iloji boricha qayta ishlatishga harakat qiladi.
7. Real time-da UI-ni yangilash.
Va nihoyat, Flutter hot-reload paytida kiritilgan o'zgarishlarni aks ettirish uchun UI-ni yangilaydi.
RendererBinding klassi bu jarayonni tartibga solib, layout, painting va kompozitsiyani boshqaradi. Flutter saqlab qolgan renderlash tizimidan foydalanadi, bu unga UI-ni faqat o'zgargan qismlarini samarali yangilash imkonini beradi.
Manba : Link
#Flutter
1. Hot Reload tugmasi bosilganda.
Qayta yuklash (hot-reload) boshlanganda, Flutter uskuna (tool)-laridagi HotRunner klassi boshqaruvni o'z qo'liga oladi. Ushbu sinf butun jarayonni tartibga solish uchun javobgardir.
HotRunner birinchi navbatda ilovaning hot-reload-ga ruhsat berilgan holatda ekanligini tekshiradi. U oxirgi kompilyatsiyadan keyin qaysi fayllar o'zgartirilganligini aniqlaydi. U "VM Service Protocol" yordamida Dart VM bilan bog'lanadi.
2. Manba kodini yangilash (Dart VM code injection).
Dart VM yangilangan kodni oladi va uni ishlaydigan dasturga kiritadi.
VM o'zgartirilgan kutubxonalarning yangi versiyalarini yaratadi. Yangilanishlarni samarali boshqarish uchun u "copy-on-write" mexanizmidan foydalanadi. Kodning eski versiyalari, agar kerak bo'lsa, ortga qaytishga ruxsat berish uchun xotirada saqlanadi.
3. JIT yordamida kodni kompilyatsiya qilish.
Dart VM-ning JIT kompilyatori yangi kodni tezda kompilyatsiya qiladi.
U optimallashtirish uchun ichki keshlash (inline caching) va "type feedback" usullardan foydalanadi. Kompilyator jarayonni tezlashtirish uchun avvalgi kompilyatsiyani iloji boricha qayta ishlatishga harakat qiladi.
4. Eski va yangi vidjet daraxtlarini solishtirish.
Flutter framework, yangilanishi kerak bo'lgan narsalarni aniqlash uchun eski vidjet daraxtini yangisi bilan taqqoslaydi.
Bu jarayon Flutterning vidjet va render obyektlari oʻrtasidagi moslashtirish qatlami boʻlgan Element tree-dan foydalanadi. U vidjet identifikatori va holatini saqlashni boshqara oladigan samarali farqlash algoritmidan foydalanadi.
5. Ta'sir qilingan vidjetlarni aniqlash va qayta tiklash.
Taqqoslash asosida Flutter qaysi vidjetlarni qayta qurish kerakligini aniqlaydi va ularni rekonstruksiya qilishni rejalashtiradi.
BuildOwner klassi bu jarayonni boshqaradi va qayta qurish kerak bo'lgan elementlar ro'yxatini saqlaydi. Joriy ilova holatini saqlab qolish uchun iloji boricha state obyektlari saqlanadi.
6. Xotira va axlat yig'ish (garbage collector)-ni boshqarish.
Qayta yuklash jarayonida Flutter oqish (leak)-ning oldini olish va silliq ishlashini ta'minlash uchun xotirani diqqat bilan boshqarishi kerak.
Dart VM axlat yig'uvchisi endi kerak bo'lmagan narsalarni tozalash uchun ishlaydi. Ramka xotira buzilishini minimallashtirish uchun mavjud ob'ektlarni iloji boricha qayta ishlatishga harakat qiladi.
7. Real time-da UI-ni yangilash.
Va nihoyat, Flutter hot-reload paytida kiritilgan o'zgarishlarni aks ettirish uchun UI-ni yangilaydi.
RendererBinding klassi bu jarayonni tartibga solib, layout, painting va kompozitsiyani boshqaradi. Flutter saqlab qolgan renderlash tizimidan foydalanadi, bu unga UI-ni faqat o'zgargan qismlarini samarali yangilash imkonini beradi.
Manba : Link
#Flutter
👍2
Flutterda Platforma channel-lar haqida.
Flutter-da Platform channel-lar Dart kodi va platformaga xos kod (masalan, Java/Kotlin Android uchun yoki iOS uchun Swift, Objective-C) o'rtasida aloqa o'rnatish uchun muhim vositalardir. Ushbu channel-lar Flutter ilovalariga Dart orqali to'g'ridan-to'g'ri kirish imkoni bo'lmagan nativ funksiyalardan foydalanish imkonini beradi.
Method channel.
Asosan nativ tomonga bir martalik so'rovlar qilish uchun ishlatiladi. Bu sizga nativ platformada metodlarni chaqirish va javobni qaytib olish imkonini beradi. Method channel asinxron metodlarni qo'llab-quvvatlaydi, ya'ni Flutter ilovangiz nativ tomondan javob kutayotganda ishlashni davom etaveradi.
Event channel.
Bu nativ tomondan Flutterga ma'lumotlarni uzatish (stream) uchun mo'ljallangan. Bu sensor ma'lumotlari yoki real vaqtda bildirishnoma (notification)-lar kabi doimiy yangilanishlarni olishingiz kerak bo'lganda foydali. Event kanal Flutter-ga doimiy ravishda nativ tomondan ma'lumotlarni yuborish uchun oqim (stream)-lardan foydalanadi.
Flutterdagi Event va Metod channel-lari ham ikki tomonlama aloqani qo‘llab-quvvatlaydi, lekin ular ko‘pincha turli senariylarda qo‘llaniladi.
Manbalar:
1. Official doc : Link
2. Article : Link
3. Medium : Link
4. Example code : Link
#Flutter
Flutter-da Platform channel-lar Dart kodi va platformaga xos kod (masalan, Java/Kotlin Android uchun yoki iOS uchun Swift, Objective-C) o'rtasida aloqa o'rnatish uchun muhim vositalardir. Ushbu channel-lar Flutter ilovalariga Dart orqali to'g'ridan-to'g'ri kirish imkoni bo'lmagan nativ funksiyalardan foydalanish imkonini beradi.
Method channel.
Asosan nativ tomonga bir martalik so'rovlar qilish uchun ishlatiladi. Bu sizga nativ platformada metodlarni chaqirish va javobni qaytib olish imkonini beradi. Method channel asinxron metodlarni qo'llab-quvvatlaydi, ya'ni Flutter ilovangiz nativ tomondan javob kutayotganda ishlashni davom etaveradi.
Event channel.
Bu nativ tomondan Flutterga ma'lumotlarni uzatish (stream) uchun mo'ljallangan. Bu sensor ma'lumotlari yoki real vaqtda bildirishnoma (notification)-lar kabi doimiy yangilanishlarni olishingiz kerak bo'lganda foydali. Event kanal Flutter-ga doimiy ravishda nativ tomondan ma'lumotlarni yuborish uchun oqim (stream)-lardan foydalanadi.
Flutterdagi Event va Metod channel-lari ham ikki tomonlama aloqani qo‘llab-quvvatlaydi, lekin ular ko‘pincha turli senariylarda qo‘llaniladi.
Manbalar:
1. Official doc : Link
2. Article : Link
3. Medium : Link
4. Example code : Link
#Flutter
👍4
Flutterda Expanded vs Flexible vidjetlari farqi.
Flexible (moslashuvchan).
Bu vidjet bola (child) vidjetiga ota vidjetining asosiy o‘qi (main axis) bo‘ylab mavjud bo‘sh joyni egallash imkonini beradi. Bola vidjetning boshqa moslashuvchan bola vidjletlarga nisbatan qancha joy egallashi kerakligini "flex" qiymat berish orqali belgilanadi, "fit" maydoni dastlabki holatda FlexFit.loose.
Expanded (kengaytirilgan).
Bu vidjet Flexible class-dan voris olgan va "fit" maydoniga FlexFit.tight berilgan bo‘lib, uning bolasi asosiy o‘q bo‘ylab bo‘sh joyni to‘ldirishga majbur bo‘ladi.
Manbalar:
1. Flexible: Link
2. Expanded: Link
3. Medium: Link
4. Linkedin: Link
#Flutter
Flexible (moslashuvchan).
Bu vidjet bola (child) vidjetiga ota vidjetining asosiy o‘qi (main axis) bo‘ylab mavjud bo‘sh joyni egallash imkonini beradi. Bola vidjetning boshqa moslashuvchan bola vidjletlarga nisbatan qancha joy egallashi kerakligini "flex" qiymat berish orqali belgilanadi, "fit" maydoni dastlabki holatda FlexFit.loose.
Expanded (kengaytirilgan).
Bu vidjet Flexible class-dan voris olgan va "fit" maydoniga FlexFit.tight berilgan bo‘lib, uning bolasi asosiy o‘q bo‘ylab bo‘sh joyni to‘ldirishga majbur bo‘ladi.
Manbalar:
1. Flexible: Link
2. Expanded: Link
3. Medium: Link
4. Linkedin: Link
#Flutter
👍1
print() vs debugPrint() vs log() ?
print().
Dart SDK da mavjud bo'lgan, terminal/console ga habar chiqarish uchun parametr sifatida Object? qabul qiladigan metod. Dastur ichidagi barcha print metod natijalarini "flutter logs" terminal kod orqali debug va release rejimida ko'rish mumkin.
Agar print-ga berilayotgan habar malum limitdan (4 * 1024) oshib ketsa, Android tomonidan bazi log qatorlari tashlab ketilishi mumkin. Faqat debug rejimida log-larni terminalga chiqarish uchun Flutter-ga tegishli kDebugMode maydon orqali tekshirish mumkin.
debugPrint().
Flutter SDK da mavjud bo'lgan, terminalga habar chiqarish uchun parametr sifatida faqat String qabul qiladigan metod. Odatda bu metod har bir operatsion tizimning chop etish (print) chegarasidan qochish uchun ishlatiladi. Bu release rejimida ham chop etiladi, lekin uni faqat debug rejimida ishlashi uchun sozlashingiz mumkin.
log().
Bu funksiya dart:developer kutubxonasining bir qismi boʻlib, tizimli log-lar uchun ishlatiladi. Bu sizga turli darajadagi (info, warning, error) xabarlarni log-ga kiritish imkonini beradi. print() va debugPrint() dan farqli o'laroq log() ko'pincha ishlab chiqarish (production) muhitida muhim voqea (event)-lar va xatolarni konsolni keraksiz chiqishlar bilan bezovta qilmasdan yozib olish uchun ishlatiladi.
Manbalar:
1. Official doc : Link
2. Article : Link
3. StackOverFlow : Link
4. Linkedin : Link
#Flutter
print().
Dart SDK da mavjud bo'lgan, terminal/console ga habar chiqarish uchun parametr sifatida Object? qabul qiladigan metod. Dastur ichidagi barcha print metod natijalarini "flutter logs" terminal kod orqali debug va release rejimida ko'rish mumkin.
Agar print-ga berilayotgan habar malum limitdan (4 * 1024) oshib ketsa, Android tomonidan bazi log qatorlari tashlab ketilishi mumkin. Faqat debug rejimida log-larni terminalga chiqarish uchun Flutter-ga tegishli kDebugMode maydon orqali tekshirish mumkin.
debugPrint().
Flutter SDK da mavjud bo'lgan, terminalga habar chiqarish uchun parametr sifatida faqat String qabul qiladigan metod. Odatda bu metod har bir operatsion tizimning chop etish (print) chegarasidan qochish uchun ishlatiladi. Bu release rejimida ham chop etiladi, lekin uni faqat debug rejimida ishlashi uchun sozlashingiz mumkin.
log().
Bu funksiya dart:developer kutubxonasining bir qismi boʻlib, tizimli log-lar uchun ishlatiladi. Bu sizga turli darajadagi (info, warning, error) xabarlarni log-ga kiritish imkonini beradi. print() va debugPrint() dan farqli o'laroq log() ko'pincha ishlab chiqarish (production) muhitida muhim voqea (event)-lar va xatolarni konsolni keraksiz chiqishlar bilan bezovta qilmasdan yozib olish uchun ishlatiladi.
Manbalar:
1. Official doc : Link
2. Article : Link
3. StackOverFlow : Link
4. Linkedin : Link
#Flutter
Flutterda Dynamic island.
Dynamic Island - bu birinchi marta Apple tomonidan iPhone 14 Pro va Pro Max modellari bilan taqdim etilgan UI kontseptsiyasi. Bu UX (foydalanuvchi tajribasi)-ni to'xtatmasdan notification, alert va davom etayotgan harakatlarni ko'rsatishning uzluksiz usulini ta'minlash uchun mo'ljallangan.
Funksiya ekranning yuqori qismidagi tabletka shaklidagi kesmani ishlatadi va joriy faoliyat yoki bildirishnoma asosida uning hajmi va ichidagi kontentni dinamik ravishda o'zgartiradi.
Dinamik orolning asosiy xususiyatlari.
Jonli harakatlar: U musiqa tinglash, timer yoki sport natijalari kabi real vaqtda ma'lumotlarni ko'rsatishi mumkin, bu esa foydalanuvchilarga ilovalarni ochmasdan xabardor bo'lishni osonlashtiradi.
Bildirishnomalar: An'anaviy bildirishnoma banneri o'rniga foydalanuvchilar umumiy interfeysni yaxshilagan holda ogohlantirishlarni yanada integratsiyalashgan tarzda ko'rishlari mumkin.
Ko'p vazifa (multi-tasking): foydalanuvchilar bir vaqtning o'zida bir nechta ilovalar bilan ishlashlari mumkin, chunki Dinamik orol turli manbalardan ma'lumotlarni ko'rsatishi mumkin.
Manbalar:
1. Medium: Link
2. Medium: Link
3. Medium: Link
4. Video: Link
5. Video: Link
#Flutter
Dynamic Island - bu birinchi marta Apple tomonidan iPhone 14 Pro va Pro Max modellari bilan taqdim etilgan UI kontseptsiyasi. Bu UX (foydalanuvchi tajribasi)-ni to'xtatmasdan notification, alert va davom etayotgan harakatlarni ko'rsatishning uzluksiz usulini ta'minlash uchun mo'ljallangan.
Funksiya ekranning yuqori qismidagi tabletka shaklidagi kesmani ishlatadi va joriy faoliyat yoki bildirishnoma asosida uning hajmi va ichidagi kontentni dinamik ravishda o'zgartiradi.
Dinamik orolning asosiy xususiyatlari.
Jonli harakatlar: U musiqa tinglash, timer yoki sport natijalari kabi real vaqtda ma'lumotlarni ko'rsatishi mumkin, bu esa foydalanuvchilarga ilovalarni ochmasdan xabardor bo'lishni osonlashtiradi.
Bildirishnomalar: An'anaviy bildirishnoma banneri o'rniga foydalanuvchilar umumiy interfeysni yaxshilagan holda ogohlantirishlarni yanada integratsiyalashgan tarzda ko'rishlari mumkin.
Ko'p vazifa (multi-tasking): foydalanuvchilar bir vaqtning o'zida bir nechta ilovalar bilan ishlashlari mumkin, chunki Dinamik orol turli manbalardan ma'lumotlarni ko'rsatishi mumkin.
Manbalar:
1. Medium: Link
2. Medium: Link
3. Medium: Link
4. Video: Link
5. Video: Link
#Flutter
Flutter 3.27 versiyasi.
Bu versiyada framework, engine va ekotizim bo‘yicha yangilanishlar, jumladan, Impeller bilan ishlash va Cupertino vidjetlarini yaxshilash bo‘yicha yangilanishlar bor. Bundan tashqari, DevTools-da qiziqarli yangi xususiyatlar taqdim etilgan.
O'zgarishlar:
1. Cupertino vidjetlarida yangilanishlar.
2. Yaxshilangan Material theme va ba'zi button-lardagi kichik o'zgarishlar.
3. CarouselView-da qo'shimcha xususiyatlar.
4. Yaxshilangan Text selection.
5. Row va Column bolalariga bo'sh joy (spacing) berish imkoniyati.
6. Yangi Android qurilmalari uchun Impleller, eskilari uchun Skia default holatda.
7. IOS qurilmalarida UI bilan bog'liq muammolar tuzatildi.
8. Web-ga oid bir qancha yangilanishlar.
9. "build.gradle.kts" fayllarini support qilish.
va boshqalar...
Manba : Link
#Flutter
Bu versiyada framework, engine va ekotizim bo‘yicha yangilanishlar, jumladan, Impeller bilan ishlash va Cupertino vidjetlarini yaxshilash bo‘yicha yangilanishlar bor. Bundan tashqari, DevTools-da qiziqarli yangi xususiyatlar taqdim etilgan.
O'zgarishlar:
1. Cupertino vidjetlarida yangilanishlar.
2. Yaxshilangan Material theme va ba'zi button-lardagi kichik o'zgarishlar.
3. CarouselView-da qo'shimcha xususiyatlar.
4. Yaxshilangan Text selection.
5. Row va Column bolalariga bo'sh joy (spacing) berish imkoniyati.
6. Yangi Android qurilmalari uchun Impleller, eskilari uchun Skia default holatda.
7. IOS qurilmalarida UI bilan bog'liq muammolar tuzatildi.
8. Web-ga oid bir qancha yangilanishlar.
9. "build.gradle.kts" fayllarini support qilish.
va boshqalar...
Manba : Link
#Flutter
⚡1
Flutterda "WidgetsBindingObserver" va "AppLifecycleListener" farqlari.
Flutterda ilovaning hayot sikli (lifecycle)-ni boshqarish va hodisa (event)-larini kuzatish uchun ikkita asosiy sinf - WidgetsBindingObserver va AppLifecycleListener mavjud.
WidgetsBindingObserver.
Bu ilovaning hayot sikli hodisalarini tinglash imkonini beruvchi "mixin". U didChangeAppLifecycleState deb nomlangan metodni taqdim etadi, u ilovaning hayot sikli holati har doim oʻzgarganda (masalan, paused, resumed, inactive etc) ishga tushadi. Bu sinf Flutter ilovalaridagi hayot sikli hodisalarini kuzatishning an'anaviy usuli bo'lib kelgan.
AppLifecycleListener.
Flutter 3.13 versiyadan boshlab ilovaning hayot sikli hodisalarini tinglashning yangi usuli sifatida taqdim etildi. Bu sinf WidgetsBindingObserver bilan solishtirganda yanada sodda API taqdim etish orqali hayot siklidagi o'zgarishlarga javob berish jarayonini soddalashtiradi.
Masalan, eski usul orqali faqatgina aynan bir holat (state) o'zgarishini tinglash mumkin, yangi usul orqali esa, state-lar o'rtasidagi o'tish (transitions)-larni tinglashingiz mumkin.
Manbalar:
1. Official doc: Link
2. Official doc: Link
3. Article: Link
4. Article: Link
5. Article: Link
#Flutter
Flutterda ilovaning hayot sikli (lifecycle)-ni boshqarish va hodisa (event)-larini kuzatish uchun ikkita asosiy sinf - WidgetsBindingObserver va AppLifecycleListener mavjud.
WidgetsBindingObserver.
Bu ilovaning hayot sikli hodisalarini tinglash imkonini beruvchi "mixin". U didChangeAppLifecycleState deb nomlangan metodni taqdim etadi, u ilovaning hayot sikli holati har doim oʻzgarganda (masalan, paused, resumed, inactive etc) ishga tushadi. Bu sinf Flutter ilovalaridagi hayot sikli hodisalarini kuzatishning an'anaviy usuli bo'lib kelgan.
AppLifecycleListener.
Flutter 3.13 versiyadan boshlab ilovaning hayot sikli hodisalarini tinglashning yangi usuli sifatida taqdim etildi. Bu sinf WidgetsBindingObserver bilan solishtirganda yanada sodda API taqdim etish orqali hayot siklidagi o'zgarishlarga javob berish jarayonini soddalashtiradi.
Masalan, eski usul orqali faqatgina aynan bir holat (state) o'zgarishini tinglash mumkin, yangi usul orqali esa, state-lar o'rtasidagi o'tish (transitions)-larni tinglashingiz mumkin.
Manbalar:
1. Official doc: Link
2. Official doc: Link
3. Article: Link
4. Article: Link
5. Article: Link
#Flutter
Flutterda "debugInvertOversizedImages" haqida.
Agar true qiymat berilsa, framework keragidan koʻproq oladigan oʻlchamga dekodlangan tasvirlarni rangini oʻzgartiradi va gorizontal ravishda aylantiradi.
Undan tashqari u FlutterError.reportError-ga tasvirning dekodlangan o'lchami va displey o'lchami haqidagi ma'lumotni log-da ko'rsatadi.
Manbalar:
1. Official doc : Link
2. Medium : Link
3. Medium : Link
4. Article : Link
#Flutter
Agar true qiymat berilsa, framework keragidan koʻproq oladigan oʻlchamga dekodlangan tasvirlarni rangini oʻzgartiradi va gorizontal ravishda aylantiradi.
Undan tashqari u FlutterError.reportError-ga tasvirning dekodlangan o'lchami va displey o'lchami haqidagi ma'lumotni log-da ko'rsatadi.
Manbalar:
1. Official doc : Link
2. Medium : Link
3. Medium : Link
4. Article : Link
#Flutter
👍2
Flutterda RichText() va Text.rich() farqlari.
Text.rich()
Text vidjetning bu konstruktori matn uchun qulay bo'lib, bu yordamida bir nechta uslublar (styles) bilan matn vidjetini yaratish imkonini beradi. Argument sifatida u "TextSpan" qabul qiladi, unda har biri o'z uslubiga ega bo'lgan bir nechta kichik TextSpan obyektlarini o'z ichiga olishi mumkin va foydalanish uchun qulay.
RichText()
Bu vidjet murakkab matn layout-larni yaratishga imkon beruvchi vidjet. Matn va uning uslublarini belgilash uchun u TextSpan obyektlari daraxti (object tree)-dan foydalanadi. Har bir TextSpan o'z uslubiga ega bo'lishi va ularni murakkab matn dizaynlarini yaratish uchun joylashtirish mumkin.
Bu ikki vidjet ishlashidagi bazi farqlari haqida ham bilib qo'yish lozim.
Qo'shimcha manbalar:
1. Article : Link
2. Medium : Link
3. Medium : Link
#Flutter
Text.rich()
Text vidjetning bu konstruktori matn uchun qulay bo'lib, bu yordamida bir nechta uslublar (styles) bilan matn vidjetini yaratish imkonini beradi. Argument sifatida u "TextSpan" qabul qiladi, unda har biri o'z uslubiga ega bo'lgan bir nechta kichik TextSpan obyektlarini o'z ichiga olishi mumkin va foydalanish uchun qulay.
RichText()
Bu vidjet murakkab matn layout-larni yaratishga imkon beruvchi vidjet. Matn va uning uslublarini belgilash uchun u TextSpan obyektlari daraxti (object tree)-dan foydalanadi. Har bir TextSpan o'z uslubiga ega bo'lishi va ularni murakkab matn dizaynlarini yaratish uchun joylashtirish mumkin.
Bu ikki vidjet ishlashidagi bazi farqlari haqida ham bilib qo'yish lozim.
Qo'shimcha manbalar:
1. Article : Link
2. Medium : Link
3. Medium : Link
#Flutter
👍2
Flutterda Overlay va OverlayEntry vidjetlari.
Overlay.
Bu vidjet mustaqil ravishda boshqarilishi mumkin bo'lgan kiruvchilar (entries) to'plami. Overlay mustaqil bola vidjetlariga vizual elementlarni, boshqa vidjetlar ustiga qo‘yish orqali ularga suzish (float) imkonini beradi. Overlay ushbu vidjetlarning har biriga OverlayEntry obyektlari yordamida overlay-dagi ishtirokini boshqarish imkonini beradi.
Overlay vidjeti maxsus (custom) Stack-dan foydalanadi. Overlay-dan foydalanishning asosiy holati navigatsiya va ilovadagi sahifalarning yuqori qismiga vidjetlarni qo'shish imkoniyati bilan bog'liq.
OverlayEntry.
bu vidjet, vidjetni o'z ichiga olishi mumkin bo'lgan Overlay-dagi joy. Overlay kiruvchilari OverlayState.insert yoki OverlayState.insertAll funksiyalari yordamida Overlay-ga kiritiladi.
Overlay kiruvchisi bir vaqtning o'zida ko'pi bilan bitta overlay-da bo'lishi mumkin. Overlay Stack-dan foydalanganligi sababli, overlay kiruvchilar o'zlarini overlay ichida joylashtirish uchun Positioned va AnimatedPositioned-dan foydalanishi mumkin.
Qo'shimcha manbalar:
1. Article: Link
2. Medium: Link
#Flutter
Overlay.
Bu vidjet mustaqil ravishda boshqarilishi mumkin bo'lgan kiruvchilar (entries) to'plami. Overlay mustaqil bola vidjetlariga vizual elementlarni, boshqa vidjetlar ustiga qo‘yish orqali ularga suzish (float) imkonini beradi. Overlay ushbu vidjetlarning har biriga OverlayEntry obyektlari yordamida overlay-dagi ishtirokini boshqarish imkonini beradi.
Overlay vidjeti maxsus (custom) Stack-dan foydalanadi. Overlay-dan foydalanishning asosiy holati navigatsiya va ilovadagi sahifalarning yuqori qismiga vidjetlarni qo'shish imkoniyati bilan bog'liq.
OverlayEntry.
bu vidjet, vidjetni o'z ichiga olishi mumkin bo'lgan Overlay-dagi joy. Overlay kiruvchilari OverlayState.insert yoki OverlayState.insertAll funksiyalari yordamida Overlay-ga kiritiladi.
Overlay kiruvchisi bir vaqtning o'zida ko'pi bilan bitta overlay-da bo'lishi mumkin. Overlay Stack-dan foydalanganligi sababli, overlay kiruvchilar o'zlarini overlay ichida joylashtirish uchun Positioned va AnimatedPositioned-dan foydalanishi mumkin.
Qo'shimcha manbalar:
1. Article: Link
2. Medium: Link
#Flutter
👍1
Dartda generator funksiya kalit so'zlari.
async.
Bu kalit so'zi funksiyani asinxron deb belgilash uchun ishlatiladi va Future obyektini qaytaradi.
async*.
Bu kalit so'zi Stream-ni qaytaradigan asinxron generator funksiyasini yaratish uchun ishlatiladi. Bu bitta natija emas, balki vaqt o'tishi bilan asinxron natijalar ketma-ketligini yaratmoqchi bo'lganingizda foydalidir.
sync*.
Bu kalit so'zi Iterable qiymatlarini qaytaradigan sinxron generator funksiyasi uchun ishlatiladi.
yield.
Bu kalit so'zi, async* va sync* funksiyalarida, funksiyani chaqiruvchi (caller)-ga bitta qiymatni chiqarish (emit) uchun qo'llaniladi.
yield*.
Bu kalit so'zi qiymatlarni boshqa generatorga (async* yoki sync*) topshirish uchun ishlatiladi.
Qo'shimcha manbalar:
1. Medium : Link
2. Medium : Link
3. Medium : Link
4. GFG : Link
#Flutter
async.
Bu kalit so'zi funksiyani asinxron deb belgilash uchun ishlatiladi va Future obyektini qaytaradi.
async*.
Bu kalit so'zi Stream-ni qaytaradigan asinxron generator funksiyasini yaratish uchun ishlatiladi. Bu bitta natija emas, balki vaqt o'tishi bilan asinxron natijalar ketma-ketligini yaratmoqchi bo'lganingizda foydalidir.
sync*.
Bu kalit so'zi Iterable qiymatlarini qaytaradigan sinxron generator funksiyasi uchun ishlatiladi.
yield.
Bu kalit so'zi, async* va sync* funksiyalarida, funksiyani chaqiruvchi (caller)-ga bitta qiymatni chiqarish (emit) uchun qo'llaniladi.
yield*.
Bu kalit so'zi qiymatlarni boshqa generatorga (async* yoki sync*) topshirish uchun ishlatiladi.
Qo'shimcha manbalar:
1. Medium : Link
2. Medium : Link
3. Medium : Link
4. GFG : Link
#Flutter
Yuqoridagi ikki funksiyaning farqlari :
getData.
Qaytaruvchi qiymati sifatida void belgilangan bo'lsa ham, ichki holatda Future obyektini qaytaradi. Xatoliklar (errors)-ni ushlash qiyin va qiymat qaytishini kutib turish uchun await kalit so'zini ishlatib bo'lmaydi. Asosan event handler va UI callback uchun va operatsiya tugallanishini kutishni istamaganimizda ishlatamiz.
getData2.
Qaytaruvchi qiymati aniq belgilangan. Xatolik va qiymatni qabul qilish oson (catchError, then, whenComplete etc). Jiddiy operatsiyalar uchun yaxshi (Networking, file IO etc).
Manbalar:
1. Official doc : Link
2. Medium : Link
#Flutter
getData.
Qaytaruvchi qiymati sifatida void belgilangan bo'lsa ham, ichki holatda Future obyektini qaytaradi. Xatoliklar (errors)-ni ushlash qiyin va qiymat qaytishini kutib turish uchun await kalit so'zini ishlatib bo'lmaydi. Asosan event handler va UI callback uchun va operatsiya tugallanishini kutishni istamaganimizda ishlatamiz.
getData2.
Qaytaruvchi qiymati aniq belgilangan. Xatolik va qiymatni qabul qilish oson (catchError, then, whenComplete etc). Jiddiy operatsiyalar uchun yaxshi (Networking, file IO etc).
Manbalar:
1. Official doc : Link
2. Medium : Link
#Flutter
👍1
Dart FFI haqida.
FFI (Foreign Function Interface) - bu Dart kodi va C/C++ kutubxonalari o'rtasidagi ko'prik vazifasini bajaradi, yani Dartdan turib nativ C kodlariga murojaat qilish, mavjud kutubxonalarni integratsiya qilish va nativ xotira bilan ishlash imkonini beradi.
Asosiy funksionalliklari.
1. Nativ C/C++ funksiyalarini to'g'ridan-to'g'ri Dart kodidan chaqirish imkonini beradi.
2. Nativ ma'lumotlar tuzilmalari (structure) va turlari (types)-ga kirishni ta'minlaydi.
3. Nativ kutubxonalarning dinamik va statik ulanishini qo'llab-quvvatlaydi.
4. Android, iOS, Windows, macOS va Linux kabi bir nechta platformalar va IoT dasturlarida ishlaydi. Veb-ilovalar FFI o'rniga JavaScript interop-dan foydalanadi.
5. Nativ kod orqali yuqori unumli hisob-kitoblarni amalga oshiradi.
6. Codec, image processing va kriptografiya kabi operatsiyalar uchun ideal yechim.
7. Katta turdagi API-lar uchun avtomatik ulanishlarni ffigen paketi orqali amalga oshirish mumkin.
Qo'shimcha manbalar:
1. Article : Link
2. Codelab : Link
3. Video : Link
#Flutter
FFI (Foreign Function Interface) - bu Dart kodi va C/C++ kutubxonalari o'rtasidagi ko'prik vazifasini bajaradi, yani Dartdan turib nativ C kodlariga murojaat qilish, mavjud kutubxonalarni integratsiya qilish va nativ xotira bilan ishlash imkonini beradi.
Asosiy funksionalliklari.
1. Nativ C/C++ funksiyalarini to'g'ridan-to'g'ri Dart kodidan chaqirish imkonini beradi.
2. Nativ ma'lumotlar tuzilmalari (structure) va turlari (types)-ga kirishni ta'minlaydi.
3. Nativ kutubxonalarning dinamik va statik ulanishini qo'llab-quvvatlaydi.
4. Android, iOS, Windows, macOS va Linux kabi bir nechta platformalar va IoT dasturlarida ishlaydi. Veb-ilovalar FFI o'rniga JavaScript interop-dan foydalanadi.
5. Nativ kod orqali yuqori unumli hisob-kitoblarni amalga oshiradi.
6. Codec, image processing va kriptografiya kabi operatsiyalar uchun ideal yechim.
7. Katta turdagi API-lar uchun avtomatik ulanishlarni ffigen paketi orqali amalga oshirish mumkin.
Qo'shimcha manbalar:
1. Article : Link
2. Codelab : Link
3. Video : Link
#Flutter
AGP vs Gradle farqlari.
Gradle - bu umumiy maqsadli qurilishni avtomatlashtirish vositasi (build automation tool). U Java/Kotlin va Android kabi ko'plab tillar va platformalar uchun kodni kompilyatsiya qilish, qurish (build), bog'liqliklarni boshqarish va paketlash uchun ishlatiladi.
AGP (Android Gradle Plugin) - bu Gradle uchun plagin bo'lib, Android ilovalarini yaratish uchun zarur boʻlgan mantiq va vazifalarni taqdim etadi, masalan, resurslarni kompilyatsiya qilish, APK-larni imzolash (signing apk), AndroidManifest faylni boshqarish va boshqalar.
AGP va Gradle versiyalari bir-biriga mos bo'lishi juda muhim. Quyidagi sahifa orqali mos versiyalarni ko'rishingiz mumkin.
Gradle va AGP versiyalari quyidagi fayllarda ko'rsatilgan bo'ladi:
Gradle:
AGP:
Flutter ikkalasini ham ishlatadi. Flow esa quyidagicha:
Qo'shimcha manbalar:
1. Gradle - Link
2. AGP - Link
3. Article - Link
#Flutter
Gradle - bu umumiy maqsadli qurilishni avtomatlashtirish vositasi (build automation tool). U Java/Kotlin va Android kabi ko'plab tillar va platformalar uchun kodni kompilyatsiya qilish, qurish (build), bog'liqliklarni boshqarish va paketlash uchun ishlatiladi.
AGP (Android Gradle Plugin) - bu Gradle uchun plagin bo'lib, Android ilovalarini yaratish uchun zarur boʻlgan mantiq va vazifalarni taqdim etadi, masalan, resurslarni kompilyatsiya qilish, APK-larni imzolash (signing apk), AndroidManifest faylni boshqarish va boshqalar.
AGP va Gradle versiyalari bir-biriga mos bo'lishi juda muhim. Quyidagi sahifa orqali mos versiyalarni ko'rishingiz mumkin.
Gradle va AGP versiyalari quyidagi fayllarda ko'rsatilgan bo'ladi:
Gradle:
// gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
AGP:
// build.gradle (Project-level)
classpath 'com.android.tools.build:gradle:8.1.4'
Flutter ikkalasini ham ishlatadi. Flow esa quyidagicha:
Flutter (calls) → Gradle (uses) → AGP (builds Android)
Qo'shimcha manbalar:
1. Gradle - Link
2. AGP - Link
3. Article - Link
#Flutter
🔥1
Flutterda Deep Link.
Deep Link (custom URI schemes)
Bu havolalar ilovangizni ochish va muayyan sahifalarga yo'naltirish uchun "myapp://profile?id=123" kabi maxsus URI sxemalaridan foydalanadi.
Androidda bu Deep link deb ataladi, iOS-da esa maxsus URL sxemasi (custom URL scheme) deb ataladi. Agar siz domenga ega bo'lmasangiz, lekin deep link kuchidan foydalanmoqchi bo'lsangiz, bu usul qulay.
Ilovangizda o'zingizga yoqqan har qanday maxsus sxemani tanlashingiz mumkin. Ammo salbiy tomoni shundaki, u xavfsizligi past, chunki har qanday ilova sizning shaxsiy sxemangizni o'g'irlashi va havolalaringizni ochishga urinishi mumkin.
Web Link (Android App Link / IOS Universal Link).
Android-da App Link va iOS-da Universal Link sifatida tanilgan bu usul mobil ilovangizga Deep Link yordamini qo'shishning eng xavfsiz usulini ta'minlaydi.
Bu sizdan domenga ega bo'lishingizni va ikkala tomondan tekshirishni amalga oshirishingizni talab qiladi. Domeningizni ilova kodi (Androiddagi manifest fayli va iOSʼdagi Associated Domains) ichida roʻyxatdan oʻtkazishingiz va server tomonida mobil ilovangizni tasdiqlashingiz kerak.
Ushbu vazifani bajarish orqali ilovangiz domenni taniydi va domen ilovangizni tasdiqlaydi. Ushbu ikki tomonlama tekshirish Deep Link-larning yaxlitligi va haqiqiyligini ta'minlaydi va uni xavfsiz qiladi.
Manbalar:
1. Official doc: Link
2. Medium: Link
3. Article: Link
#Flutter
Deep Link (custom URI schemes)
Bu havolalar ilovangizni ochish va muayyan sahifalarga yo'naltirish uchun "myapp://profile?id=123" kabi maxsus URI sxemalaridan foydalanadi.
Androidda bu Deep link deb ataladi, iOS-da esa maxsus URL sxemasi (custom URL scheme) deb ataladi. Agar siz domenga ega bo'lmasangiz, lekin deep link kuchidan foydalanmoqchi bo'lsangiz, bu usul qulay.
Ilovangizda o'zingizga yoqqan har qanday maxsus sxemani tanlashingiz mumkin. Ammo salbiy tomoni shundaki, u xavfsizligi past, chunki har qanday ilova sizning shaxsiy sxemangizni o'g'irlashi va havolalaringizni ochishga urinishi mumkin.
Web Link (Android App Link / IOS Universal Link).
Android-da App Link va iOS-da Universal Link sifatida tanilgan bu usul mobil ilovangizga Deep Link yordamini qo'shishning eng xavfsiz usulini ta'minlaydi.
Bu sizdan domenga ega bo'lishingizni va ikkala tomondan tekshirishni amalga oshirishingizni talab qiladi. Domeningizni ilova kodi (Androiddagi manifest fayli va iOSʼdagi Associated Domains) ichida roʻyxatdan oʻtkazishingiz va server tomonida mobil ilovangizni tasdiqlashingiz kerak.
Ushbu vazifani bajarish orqali ilovangiz domenni taniydi va domen ilovangizni tasdiqlaydi. Ushbu ikki tomonlama tekshirish Deep Link-larning yaxlitligi va haqiqiyligini ta'minlaydi va uni xavfsiz qiladi.
Manbalar:
1. Official doc: Link
2. Medium: Link
3. Article: Link
#Flutter