Pure Coder
787 subscribers
189 photos
30 videos
8 files
150 links
⭕️آدرس سایت:
https://purecoder.ir

⭕️گروه پرسش و پاسخ:
@purecoder_gp

⭕️پشتیبانی:
@PureCoder_support
@MohammadTaherri
Download Telegram
⚡️⚡️debug vs profile vs release⚡️⚡️

توی فلاتر سه حالت برای خروجی گرفتن و اجرا کردن اپ داریم.
✔️debug
✔️profile
✔️release

حالت release که برای خروجی گرفتن نهایی و انتشار اپلیکیشن هست.

ولی چه تفاوتی بین حالت debug و profile هست ؟

🔥یکی از نکات مهم این هست که برای تست پرفرمانس اپ و بررسی مشکلات احتمالی و به اصطلاح لگ هایی که ممکنه موقع کار با اپ پیش بیاد باید از حالت profile استفاده کنیم.

چرا؟

🔥یکی از دلایل این هست که در حالت debug برای کمک به روند توسعه و خطایابی بهتر تعداد زیادی assert هنگام اجرای کد های فریمورک اجرا میشه که باعث افت پرفرمانس اپ در حالت debug میشه که این assert ها در حالت profile و release هیچ تاثیری ندارن.

🔥پس برای تست پرفرمانس اپ به هیچ وجه از حالت debug استفاده نکنید چون که ۱۰۰ درصد نتیجه نادرست خواهد بود.

🔥نکته دیگه این که برای اینکه بهترین تست پرفرمانس رو داشته باشید از دیوایس واقعی استفاده کنید.
پس
Profile mode + Real device

🔥همچنین میتونید از ابزارهایی که فلاتر در حالت profile در اختیارتون میگذاره برای تست پرفرمانس اپ و... استفاده کنید.
⚡️⚡️⚡️set get in Dart⚡️⚡️⚡️

اگه بخوایم این قاعده رو در دارت پیاده کنیم باید فیلد مورد نظر رو private کنیم و بعدش setter و getter تعریف کنیم.

String get name => _name;
String _name;
set name(String value) {
if(_name == value) return;
_name = value;
}

🔥ترتیبی که معمولن استفاده میکنن برای نوشتن کدها به شکل بالا هست.
✔️اول getter
✔️بعد فیلد private
✔️بعد setter

الزامی نیست ولی میتونید این ترتیب رو رعایت کنید. 😊

ولی ایا توی دارت همیشه نیازی به تعریف setter و getter داریم؟
نه.

مثلن وقتی که فیلد مورد نظر final هست (که قاعدتن read-only هم میشه) نیاز نیست که دیگ setter و getter تعریف کنیم.

یه نمونه واضح بخوایم مثال بزنیم ویجت های فلاتر هست.
همه ویجت ها immutable هستن و باید فیلد هاشون final باشن.
خب وقتی که یه ویجت جدید رو ایجاد میکنیم (فرقی نداره چه نوعی باشه) کافیه فقط یه سری فیلد final تعریف کنیم.

🔥به صورت واضح تر بخوایم بگیم توی دارت هر instance field خودش به صورت ضمنی (implicit) هم یه getter هست و هم یه setter.

یعنی وقتی که توی یه کلاس یه فیلد جدید تعریف میکنید برای مثال :
String name;
این فیلد خودش هم setter هست و هم getter.
و نیازی نیست که دیگه به صورت جداگانه براش setter یا getter تعرسف کنیم.

زمانی هم که فیلد رو final کنیم read-only میشه.

پس با این حساب توی دارت چه وقتایی setter یا getter تعریف کنیم؟

✔️زمانی که میخوایم توی این متد ها یه کاری اضافه تر از return کردن مقدار (getter) یا ثبت مقدار (setter) انجام بدیم.

✔️زمانی که لازمه فیلد مورد نظر write-only بشه.

✔️زمانی که لازم داریم یه field جدید علاوه بر instance field های قبلی به کلاس اضافه کنیم.
مثلن یه فیلدی که قراره از instance field های دیگه استفاده کنه.

String firstname;
String lastname;

String get fullname => '$firstname $lastname';

✔️توی abstract class ها هم وقتی که یه فیلدی داریم که قراره توی کلاس های فرزند تعیین تکلیف و مقدار دهی بشه معمولن از یه getter به صورت abstract استفاده میکنیم.

String get name;

و کلاس های فرزند اون رو override میکنن.

این نکته رو توی بحث abstraction بیشتر توضیح میدیم.
سوال
ایا فلاتر single thread هست؟ (دلیلتون رو توضیحم بدید بد نیست)
Anonymous Poll
61%
آره
39%
نه
Pure Coder
سوال
ایا فلاتر single thread هست؟ (دلیلتون رو توضیحم بدید بد نیست)
دوستانی که گفتن نه حالا بگن چنتا thread داریم توی فلاتر؟ 😁🤔
🔥Capsule
⚡️⚡️⚡️Flutter threads⚡️⚡️⚡️
1️⃣

آیا فلاتر single thread هست؟ 🤔

جواب این سوال هم آره هست و هم نه. 😳😳
ولی چرا اره و چرا نه.

بستگی داره از چه نظر به موضوع نگاه کنیم.

🔥اگه فقط کدهایی که خودمون داریم مینویسیم رو در نظر بگیریم و کار هایی ک framework فلاتر روی کدهای ما انجام میده به جواب آره میرسیم.

جهت یادآوری بگم که قبلن توی یه پست دیگه در مورد بخش های مختلف فلاتر توضیح دادیم و گفتیم که فلاتر از یه بخش به اسم framework که کلن با Dart نوشته شده و یه بخش دیگه به اسم engine که با c++ نوشته شده و ... تشکیل شده.

اینجا منظورمون از framework هم همون بخش نوشته شده با Dart هست.

✔️این جا یه thread داریم به اسم UI thread که تمام کدهایی که ما نوشتیم به علاوه کار هایی framework انجام میده، داخلش انجام میشه.

حالا کار هایی که framework انجام میده چیه؟
بحث کردن راجب این موضوع خیلی مفصله ولی به طور کلی و خیلی ساده framework کدهای ما (ویجت ها) رو به ی سری painting commands تبدیل میکنه که بعدن اون رو تحویل engine بده و engine هم اون رو روی صفحه نمایش بده.

همچنین کارهای دیگه ای هم framework انجام میده از جمله دریافت event هایی مثل touch یا click های کاربر از engine و پردازش اون ها و هدایت کردن اون touch ها به سمت object های هدف.

کارهای framework به این موارد خلاصه نمیشن....

همه این کارها در یک thread انجام میشه(یک isolate که یک thread داره)

🔥پس نکته مهمی که این جا مطرح هست block نشدن این thread هست.

یعنی باید جوری کد بنویسیم که این thread قفل یا block نشه که اگه این اتفاق بیوفته نتیجش افت frame و لگ توی برنامه (به خصوص موقع اجرای انیمیشن ها خواهد بود)

🔥برای جلوگیری از block شدن این thread میتونیم برای پردازش های سنگین ، isolate های دیگه ای بسازیم.


✔️در مورد جواب ،،نه،، این سوال هم توی پست بعدی صحبت میکینم. ☺️
#capsule
#advanced
#single_thread
🔥Capsule
⚡️⚡️⚡️Flutter threads⚡️⚡️⚡️
2️⃣

آیا فلاتر single thread هست؟ 🤔

خب بریم در مورد جواب ،، نه،، سوال بالا صحبت کنیم.

گفتیم که همه کدهای ما به علاوه پردازش های framework توی یه thread به اسم UI thread انجام میشه. و در نهایت یک سری painting command ها تولید میشن

.ولی این command ها به چه دردی میخورن ؟
🔥این ها به یه thread دیگه ای تحویل داده میشن که مسئولیتش ارتباط برقرار کردن با پردازشگر و درنهایت نمایش تصویر روی نمایشگر هست.

پس یه thread دیگه هم وارد کار شد که اسمش raster thread هست.

🔥همون طور که گفتیم کار Raster thread که بهش GPU thread هم میگن، دریافت painting command ها از UI thread و نمایش اون ها هست (این کار توسط engine که به زبان c++ نوشته شده انجام میشه)

🔥این دو thread یعنی UI و raster نقش اصلی در پرفرمانس اپ رو ایفا میکنن.

🔥ما به raster thread دسترسی نداریم ولی کدهایی که مینویسیم تاثیر مستقیم توی کار اون و پرفرمانسش داره.
پس اگه اپتون با افت فریم مواجه شد دلیلش رو توی کدهای خودتون جستجو کنید و به raster thread یا... انگ نچسبونید 😂😂.

🔥یه thread مهم دیگه هم به اسم IO thread داریم که وظیفش هندل کردن تسک های سنگین هست.
خیلی از future هایی که استفاده میکنیم میره توی این thread و پردازش میشه و بعد از این که done شد برمیگرده و یه event توی UI thread اجرا میشه.

ایا thread های دیگه هم غیر از این سه تا داریم ؟
✔️UI
✔️Raster
✔️IO
✔️? 🤔

#capsule
#advanced
#single_thread
استارت مقاله جدید هم از امروز میخوره
Dart null safety😍😍😍

با همون سبک مقاله های Dart const

اگه مقاله های مربوط به Dart const رو نخوندی زودتر شرو کن.
قسمت بعدی داستان null safety در دارت به زودی منتشر میشه...

😣نال فرزند ناخلف 😅

اگه قسمت اول رو نخوندی زودتر بخونش 😍
Forwarded from 🎥 اپارات 🎥
This media is not supported in your browser
VIEW IN TELEGRAM
عنکبوت رو‌ تا حالا اینجوری اسکول کرده بودید؟ 😅
معلوم نیست چی تو مغز عنکبوت میگذره و چه توهمی نسبت به نشانگر ماوس داره

🎬 @aparatcheh 🎞
دوستان گل قسمت جدید مجموعه null safety هم منتشر شد.
بخونید و لذت ببرید😍😍
🔥قسمت بعدی مجموعه داستان null safety در دارت به زودی منتشر میشه😍

⚡️در این قسمت دارت با توتئه برنامه نویس ها دستگیر و دادگاهی میشه😂😂

برای دنبال کردن قسمت های قبلی لینک زیر رو ببین :
https://virgool.io/flutter-challenge/dart-null-safety-introduction-qelr6jcpsj1c

https://t.me/flutter_challenges
Forwarded from Books & Articles 🇮🇷 (Mohammad Taheri)
clean-code-uncle-bob.pdf
2.8 MB
🔥Challenge
در مورد FIFO و LIFO چی میدونی؟

#challenge #intermediate
🔥Capsule
⚡️⚡️FIFO vs LIFO⚡️⚡️

FIFO : first in first out
LIFO : last in first out

Queue => FIFO
Stack => LIFO

🔥استک مثل یک لیوان میمونه، هر چیزی که اخر اضافه بشه موقع خارج شدن اول از همه میره بیرون

🔥صف مثل لوله هست هر چیزی که اول وارد شده زودتر از همه هم خارج میشه

#سوال
ایا فلاتر از این مفاهیم استفاده میکنه؟ از هر دو تاش استفاده میکنه و یا یکیش یا هیچ کدوم؟ 🤔

#intermediate #capsule
🔥Capsule
⚡️⚡️EdgeInsetsGeometry⚡️⚡️

این کلاس معمولن برای Padding ها توی فلاتر استفاده میشه.
دو تا زیر کلاس داره :
✔️EdgeInsets
که 4 تا فیلد داره :‌left , top , right , bottom
که مقدار padding از 4 جهت رو مشخص میکنن.

✔️EdgeInsetsDirectional
که 4 تا فیلد داره :‌ start , top , end , bottom

🔥اگه اپلیکیشنتون یک زبانه هست و یا اینکه زبان های استفاده شده کلن rtl یا کلن ltr هستن میتونید همه جا از EdgeInsets استفاده کنید.

🔥اگه اپلیکیشنتون چند زبانه هست و هم زبان های rtl و هم ltr رو پشتیبانی میکنه مثلن فارسی و انگلیسی بهتره هست که از EdgeInsetsDirectional استفاده کنید.

در این حالت خود فریمورک مقادیر start و end رو بر اساس TextDirection تفسیر میکنه.

✔️اگه زبان ltr باشه(مثلن انگلیسی) در نتیجه :
TextDirection => ltr
start => left
end => right

خود فریمورک start رو به عنوان left و end رو به عنوان right تفسیر میکنه.

✔️اگه زبان rtl باشه (مثلن فارسی) در نتیجه :‌
TextDirection : rtl
start => right
end => left

🔥در این حالت دیگه نگران این نیستین که وقتی کاربر زبان رو تغییر داد مقادیر padding ها و ... به هم بخوره.

#beginner #capsule