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

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

⭕️پشتیبانی:
@PureCoder_support
@MohammadTaherri
Download Telegram
⚡️⚡️Widget is immutable⚡️⚡️

🔥ویجت توی فلاتر کلن immutable هست، فرقی نمیکنه ویجتمون Stateless باشه یا Stateful یا...

بعضی جاها میبینم که میگن Stateless ها immutable هستن و Stateful ها mutable هستن.
این جمله اصلن درست نیست.
ویجت های Stateful هم immutable هستن فقط یه State دارن که اون State در واقع mutable هست.

پس در هر صورت ویجت immutable هست و همه instance field های اون باید final باشن.

🔥پس طبق مفهوم کلاس های immutable( که توی مقاله const contractor ) بهش اشاره کردیم، هر وقت خواستیم ویجت مورد نظرمون رو بر اساس کانفیگ جدید تغییر بدیم باید یه ویجت جدید با کانفیگ جدید بسازیم نه اینکه ویجت قبلی رو اپدیت کنیم...
Pure Coder
⚡️⚡️Widget is immutable⚡️⚡️ 🔥ویجت توی فلاتر کلن immutable هست، فرقی نمیکنه ویجتمون Stateless باشه یا Stateful یا... بعضی جاها میبینم که میگن Stateless ها immutable هستن و Stateful ها mutable هستن. این جمله اصلن درست نیست. ویجت های Stateful هم immutable…
Prefer declaring const constructors on @immutable classes.dartprefer_const_constructors_in_immutables

اگه موقع ایجاد یه ویجت جدید توی نسخه جدید فلاتر (۲/۵) با این warning روبرو شدید.

بخاطر این هستش که از const constructor استفاده نکردین...

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

همون طور که گفتیم ویجت ها توی فلاتر immutable هستن و باید const constructor داشته باشن.

حالا توی این ورژن به const constructor حساس تر شده و در صورت عدم رعایت هشدار میده....
⚡️⚡️Const Widget⚡️⚡️

🔥وقتی که یه ویجت رو به const constructor مجهز میکنیم و موقع ساخت ابجکت ازش به جای new از const استفاده میکنیم، چه اتفاقی میوفته؟

اول اینکه باعث میشه از اون کلاس ابجکت های مختلف ساخته نشه و بر اساس نیاز هایی که داریم موقع کامپایل ابجکت های مورد نیاز ساخته بشه و این باعث مدیریت رم میشه.

دوم باعث میشه که موقع rebuild شدن صفحه اون ویجت rebuild نشه (به خاطر نوع برخوردی که فریمورک فلاتر با ویجت های const میکنه) و این کمک میکنه که cpu کار کمتری انجام بده.

🔥پس هم کمک کردیم به مدیریت رم و هم کمک کردیم به بهینه تر شدن پردازش هایی که قراره cpu انجام بده.

🔥🔥با توجه به اینکه اینجور مواقع اون ویجتی که واسش از const استفاده کردین دیگه rebuild نمیشه، حواستون باشه اگه یه ویجتی هست که نیازه که rebuild بشه از const استفاده نکنین.
⚡️⚡️print⚡️⚡️

اگه موقع استفاده از دستور print بهتون Warning داد که توی پروداکشن از print استفاده نکنید...

میتونید به جاش از دستور debugPrint استفاده کنید
⚡️⚡️Theme.of⚡️⚡️

🔥اگه برنامتون قراره از چند تم استفاده کنه یا به هر طریقی قراره که تم برنامه آپدیت بشه مهم هست که Theme.of رو کجا صدا بزنید...

از Theme.of استفاده میکینم برای بدست اوردن اطلاعات تم برنامه.

وقتی که تم برنامه اپدیت میشه (پارامتر theme توی متریال اپ اپدیت میشه) یا اینکه تم برنامه سوییچ میشه (توی متریال اپ themeMode تغییر میکنه), مهم هست که همه ویجت هایی که از تم استفاده میکنن خودشون رو براساس تم جدید اپدیت کنن.

حالا این جا هست که مهم میشه که Theme.of رو باید کجا صدا بزنیم؟ و با اپدیت تم برنامه چه اتفاقی رخ میده؟
Pure Coder
⚡️⚡️Theme.of⚡️⚡️ 🔥اگه برنامتون قراره از چند تم استفاده کنه یا به هر طریقی قراره که تم برنامه آپدیت بشه مهم هست که Theme.of رو کجا صدا بزنید... از Theme.of استفاده میکینم برای بدست اوردن اطلاعات تم برنامه. وقتی که تم برنامه اپدیت میشه (پارامتر theme توی…
⚡️⚡️Theme.of⚡️⚡️

🔥هر ویجتی که این متد رو صدا میزنه و context خودش رو به این متد پاس میده (خیلی مهم هست که حتمن context خودش رو پاس بده) بعد از اپدیت تم ریبیلد میشه.

🔥به صورت دقیق تر اگه یه استیت لس این متد رو صدا بزنه بعد از اپدیت تم اون ویجت ریبیلد میشه

و اگه داخل استیت یه استیت فول این متد صدا زده بشه بعد از اپدیت تم به ترتیب
didChangeDependencies
build
صدا زده میشن.

پس این متد رو داخل متد build استیت لس و یا داخل متد didChangeDependencies یا build استیت صدا بزنید.

🔥حتمن context خود ویجت رو بهش پاس بدید.

🔥🔥اگه ویجت از نوع const هم باشه بعد از اپدیت تم ریبیلد میشه. و اینجا const بودن از ریبیلد شدن جلوگیری نمیکنه.
فلاتر چند نوع ویجت داره؟ (ویجت های بیس)
اسم ویجت های مورد نظرتون رو کامنت کنید، بعدن کامل راجبش توضیح میدیم...
Anonymous Poll
51%
2
13%
3
8%
4
21%
5
8%
هیچکدوم
⚡️⚡️Types of widgets⚡️⚡️

🔥انواع ویجت ها توی فلاتر به دسته های زیر تقسیم میشن :
1) StatelessWidget
2) StatefulWidget
3) InheritedWidget
4) ParentDataWidget
5) RenderObjectWidget

خود RenderObjectWidget انواع مختلفی داره :
LeafRenderObjectWidget
SingleChildRenderObjectWidget
MultiChildRenderObjectWidget

😍در مورد هر کدوم از اینها و کاربرد هاشون صحبت میکنیم...
Pure Coder pinned a photo
⚡️⚡️InheritedWidget⚡️⚡️
1⃣
در مورد انواع ویجت های فلاتر گفتیم که برخلاف تصور رایج دو نوع ویجت بیس در فلاتر نداریم و علاوه بر ویجت های stateless و stateful ویجت های دیگه ای هم هستن .

🔥از جمله این ویجت ها که خیلی هم مهم و کاربردی هست و در core فلاتر هم ازش خیلی استفاده شده InheritedWidget هست.

🔥اولین نکته اینکه این ویجت بیس ترین و مهمترین ویجت فلاتر برای بحث state management هست.

پکیج معروف provider چیزی نیست جز یک wrapper روی این ویجت فلاتر و در واقع کار با اون رو راحت تر کرده.

پکیج Bloc هم خودش از provider و در واقع InheritedWidget استفاده میکنه.

😍😍در پست های بعدی بیشتر راجبش صحبت میکنیم.
#inherited_widget
#widgets
⚡️⚡️InheritedWidget⚡️⚡️
2⃣

وقتی که از stateful استفاده میکینم بعد از setState فقط متد build کلاس state یک بار دیگه اجرا میشه و باعث میشه که کل درختی که زیر مجموعه اون هست یک بار دیگه ساخته و کانفیگ بشه.

🔥ولی قابلیتی که inheritedWidget ارائه میده این هست که با استفاده از اون میشه هر قسمت دلخواهی از درخت رو که خواستیم (به صورت دقیق تر هر قسمت درخت که به inheritedWidget مربوطه وابسته بود) آپدیت (rebuild) کنیم.

برای این منظور یک InheritedWidget در راس درخت مورد نظر قرار میگیره.
از اونجایی که InheritedWidget یک پروکسی هست یک ویجت به عنوان child میگیره و با اون child زیر درخت اون ساخته میشه.
علاوه بر اون یک سری data هم میتونه داشته باشه و ویجت های زیر مجموعه با استفاده از دستور
widgetName.of(context)
میتونن به اون دیتا که داخل inheritedWidget هست دسترسی پیدا کنن.

🔥حالا نکته مهم اینجاست که هر موقع که inheritedWidget مربوطه اپدیت بشه و دیتاش تغییر کنه هر ویجتی که توی زیر درختش با استفاده از متد
.of
بهش وابسته شده باشه rebuild میشه و ویجت هایی که بهش وابسته نشدن rebuild نمیشن.

😍😍یعنی یک rebuild کاملن هوشمند.

🔥فقط اون هایی که بهش وابسته شدن rebuild میشن.
#inherited_widget
#widgets
⚡️⚡️InheritedWidget⚡️⚡️
3⃣
🛑مثالی که میشه از این ویجت زد ویجت Theme هست که از ویجت های فلاتر هست که از InheritedWidget استفاده کرده و باعث میشه که هر ویجتی که با استفاده از دستور Theme.of بهش وابسته شد بعد از اپدیت تم برنامه rebuild بشه.

دستور Theme.of هم دیتای مربوط به این ویجت یعنی ThemeData رو برمیگردونه که هر بار این دیتا آپدیت بشه ، ویجت های وابسته توی کل برنامه rebuild میشن.

🔥شاید برید توی کدهای فلاتر و ببینید که Theme از نوع inheritedWidget نیست.
یکم بیشتر جستجو کنید میبیند که از inheritedWidget استفاده کرده.
#inherited_widget
#widgets
⚡️⚡️assert⚡️⚡️
1⃣
اگ میخواین یک کدی فقط در حالت دیباگ اجرا شه میتونید از این دستور استفاده کنید.

assert(condition)

توی ورودی یک شرط قرار میگیره که اگه true بر گردونه ادامه کدها اجرا میشه و اگه false برگردونه برنامه همین جا متوقف میشه و یک exception رخ میده.

🔥فقط در حالت دیباگ.
#assert
#debug
⚡️⚡️assert⚡️⚡️
2⃣

assert(condition , mesaage)
شکل دوم استفاده از این دستور به صورت بالا هست که اگه شرط true برگردونه ادامه کدها اجرا میشه و اگه false برگردونه یک exception با message مورد نظر رخ میده. (message از نوع string هست)

🔰مثال

Int num = 2;
assert(num == 2)
شرط true برمیگردونه و ادامه کدها اجرا میشه

assert(num > 2)
شرط false برمیگردونه و exception رخ میده.

#assert
#debug
💊Capsule
⚡️⚡️assert⚡️⚡️
3⃣

یک روش رایج استفاده از این دستور به این شکل هست :
assert((){
//Codes that run in debug mode.
return true;
}()) ;

🔥اینجا توی ورودی بهش یه function ناشناس میدیم
() {}
و بعد با گذاشتن پرانتز باز و بسته در اخرش باعث میشیم که این function همین جا اجرا شه
() {} ()

کد هایی که میخایم فقط زمان دیباگ اجرا شن رو توی بدنه این function مینویسیم {}

و نکته مهم این هست که اخرش باید return true داشته باشیم که این assert باعث exception نشه و ادامه کدهای برنامه اجرا شه.

🔰مثال
وقتی که میخوایم داخل برنامه پرینت داشته باشیم و یه اطلاعاتی رو توی کنسول چاپ کنیم، این اتفاق فقط باید در حالت دیباگ بیوفته و در حالت ریلیز یا... نباید پرینت اجرا شه.

پس :
assert((){
print('Print something') ;
return true;
}()) ;

این function داخل assert اجرا میشه و همیشه true برمیگردونه و باعث میشه ادامه کدها اجرا بشن.
فقط در حالت دیباگ واسمون پرینت میکنه.
#assert #debug
#capsule #intermediate
⚡️⚡️یه نکته ⚡️⚡️

🔥توی هر function کدهای بعد از return اجرا نمیشن.

String getName() {
return 'mohammad';
}

🤔🤔حالا اگه یه موقعی خواستیم یه کدی بعد از return بنویسیم و اجرا شه باید چکار کنیم؟

😍با یک ترفند خیلی ساده.

String getName() {
try{
return 'Mohammad';
}finally{
print('something') ;
}
}

🔥از بلوک try... finaly استفاده میکنیم
کد های اصلی رو داخل try مینویسیم و return رو هم همون جا قرار میدیم و کدهایی که میخایم بعد return اجرا شن رو توی بلوک finaly میگذاریم 🤪
⚡️⚡️Function⚡️⚡️
1⃣
🔥توی دارت هر function خودش یه آبجکت به حساب میاد.

یعنی چی؟

یعنی دقیقن مثل وقتی که یک کلاس داریم و از اون کلاس یه آبجکت (نمونه /شی) میسازیم :
class User{}
var user = User() ;

یا وقتی که یه عدد صحیح تعریف میکنیم :
int a = 2;
و a یه ابجکت از کلاس int به حساب میاد.

دقیقن همین اتفاق هم برای function ها میوفته.

🔥توی دارت یه کلاس داریم به اسم
Function
همه function هایی که میسازیم یه ابجکت (نمونه) از این کلاس به حساب میان.

void myFunc() {}

print(myFunc is Function) //true

🔥پس وقتی که یه function مینویسیم، دارت واسمون یه ابجکت جدید از کلاس Function ایجاد میکنه و اسمی که ما برای اون function گذاشتیم مثل اسم یه متغیر هست (که یه رفرنس از اون ابجکت توی حافظه هست)

پس توی مثال بالا یه ابجکت از کلاس Function ایجاد میشه و myFunc یه متغیری هست که رفرنس اون ابجکت رو نگه میداره (دقیقن مثل قضیه کلاس ها)

#function