💊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
⚡️⚡️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 کدهای بعد از 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
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
⚡️Function⚡️⚡️
Callable class
2⃣
🔥یه مفهومی داریم توی دارت به اسم callabe class ها
این یعنی چی؟
✅کلاس زیر رو در نظر بگیرید
class User{}
حالا یه متدی به این کلاس اضافه میکنم به اسم call(اسم مهمه، حتمن باید همین اسم باشه)
class User{
void call(string name) {
print(name) ;
}
}
✔️اسم متد مهمه و حتمن باید call باشه .
✔️مقدار برگشتی (return) هر چیزی میتونه باشه .
✔️ارگومان های ورودی هر چیزی میتونن باشن.
حالا چه اتفاقی میوفته؟
✅یه ابجکت از کلاسم میسازم :
var myUser = User() :
🔥🔥حالا اگ دو تا پرانتز باز بسته بعد myUser بذارم متد call اجرا میشه، یعنی لازم نیست بگم
myUser.call('mohammad')
میگم
myUser('mohammad')
و اینجوری متد call اجرا میشه.
😍به این میگن callable class.
🔥خب حالا اگ متغیر myUser رو به ورودی یه function بدیم اون function با گذاشتن پرانتز باز و بسته میتونه اون رو اجرا کنه.
void func(User input) {
input() :
}
func(myUser) ;
#function
#callable_class
Callable class
2⃣
🔥یه مفهومی داریم توی دارت به اسم callabe class ها
این یعنی چی؟
✅کلاس زیر رو در نظر بگیرید
class User{}
حالا یه متدی به این کلاس اضافه میکنم به اسم call(اسم مهمه، حتمن باید همین اسم باشه)
class User{
void call(string name) {
print(name) ;
}
}
✔️اسم متد مهمه و حتمن باید call باشه .
✔️مقدار برگشتی (return) هر چیزی میتونه باشه .
✔️ارگومان های ورودی هر چیزی میتونن باشن.
حالا چه اتفاقی میوفته؟
✅یه ابجکت از کلاسم میسازم :
var myUser = User() :
🔥🔥حالا اگ دو تا پرانتز باز بسته بعد myUser بذارم متد call اجرا میشه، یعنی لازم نیست بگم
myUser.call('mohammad')
میگم
myUser('mohammad')
و اینجوری متد call اجرا میشه.
😍به این میگن callable class.
🔥خب حالا اگ متغیر myUser رو به ورودی یه function بدیم اون function با گذاشتن پرانتز باز و بسته میتونه اون رو اجرا کنه.
void func(User input) {
input() :
}
func(myUser) ;
#function
#callable_class
⚡️⚡️function⚡️⚡️
3⃣
🔥🔥حالا با توجه به اینکه گفتیم هر function که تعریف میکنیم یه ابجکت از کلاس Function ساخته میشه و مفهوم callable class ها، انتظار میره که درک کنید که وقتی یه function رو بدون پرانتز به ورودی یه متد پاس میدیم و اون متد با گذاشتن پرانتز اون رو اجرا میکنه چه اتفاقاتی داره میوفته. 😍😍
#function
3⃣
🔥🔥حالا با توجه به اینکه گفتیم هر function که تعریف میکنیم یه ابجکت از کلاس Function ساخته میشه و مفهوم callable class ها، انتظار میره که درک کنید که وقتی یه function رو بدون پرانتز به ورودی یه متد پاس میدیم و اون متد با گذاشتن پرانتز اون رو اجرا میکنه چه اتفاقاتی داره میوفته. 😍😍
#function
Forwarded from Pure Coder
در مورد کدوم یک از موارد زیر بیشتر صحبت کنیم؟
Anonymous Poll
22%
مفهوم BuildContext
31%
مفهوم key و کاربردهاش
14%
مفاهیم پایه ای استیت منیجمنت
33%
مفاهیم پایه ای و اصول طراحی یه معماری خوب برای اپ های فلاتر
در مورد نظر سنجی بالا...
سه مورد اول خیلی به هم وابسته هستن ..
یه مفهوم به ظاهر جدا ولی در اصل وابسته
✔️برای درک و استفاده درست و بجا از key علاوه بر اینک خود key رو باید بشناسیم باید درک درست و عمیقی از BuildContext داشته باشیم.
در واقع key فقط یه ابزار ساده و سبک برای بعضی از کاربرد ها هست که وقتی میتونیم این کاربرد ها رو به خوبی درک کنیم که مفاهیم دیگه از جمله BuildContext رو درک کرده باشیم.
❌همین جوری الکی همه جا از key استفاده نکنید.
✔️استیت منیجمنت هم حتا وقتی یه درک خوب از BuildContext داشته باشیم خیلی قشنگتر و ساده تر میشه وگرنه فقط داریم از یه ابزار استفاده میکنیم .
فرقی نمیکنه پروایدر باشه یا بلاک یا گت یا....
✔️ولی مورد اخر یعنی معماری یه بحث جامع تر و مستقل تر هست تا حدودی.
و معماری نرم افزار رو میشه حتا مستقل از فریمورک مورد استفاده ، بهش پرداخت .
پس برای تبدیل شدن به یک معمار خوب باید از دنیای فریمورک ها بیایم بیرون و صرف نظر از هر فریمورکی یه معماری خوب طراحی کنیم و بعد بعضی از بخش های معماری رو برای تطبیق پذیری با فریمورک های مختلف منعطف کنیم.
سه مورد اول خیلی به هم وابسته هستن ..
یه مفهوم به ظاهر جدا ولی در اصل وابسته
✔️برای درک و استفاده درست و بجا از key علاوه بر اینک خود key رو باید بشناسیم باید درک درست و عمیقی از BuildContext داشته باشیم.
در واقع key فقط یه ابزار ساده و سبک برای بعضی از کاربرد ها هست که وقتی میتونیم این کاربرد ها رو به خوبی درک کنیم که مفاهیم دیگه از جمله BuildContext رو درک کرده باشیم.
❌همین جوری الکی همه جا از key استفاده نکنید.
✔️استیت منیجمنت هم حتا وقتی یه درک خوب از BuildContext داشته باشیم خیلی قشنگتر و ساده تر میشه وگرنه فقط داریم از یه ابزار استفاده میکنیم .
فرقی نمیکنه پروایدر باشه یا بلاک یا گت یا....
✔️ولی مورد اخر یعنی معماری یه بحث جامع تر و مستقل تر هست تا حدودی.
و معماری نرم افزار رو میشه حتا مستقل از فریمورک مورد استفاده ، بهش پرداخت .
پس برای تبدیل شدن به یک معمار خوب باید از دنیای فریمورک ها بیایم بیرون و صرف نظر از هر فریمورکی یه معماری خوب طراحی کنیم و بعد بعضی از بخش های معماری رو برای تطبیق پذیری با فریمورک های مختلف منعطف کنیم.
⚡️⚡️Flutter Key⚡️⚡️
1⃣
توی چند پست آینده در مورد key ها صحبت میکنیم.
انواع اون ها رو بررسی میکنیم و کاربرد هر کدومشون رو میگیم.
🔥توی فلاتر یه کلاس به اسم Key داریم که abstract هست و پایه و اساس کلاس های دیگه هست.
این کلاس دو نوع فرزند داره
LocalKey
GlobalKey
این ها کلاس هایی هستند که از Key ارث بری کردند و دو نوع مختلف Key رو با کاربرد های مختلف برای ما میسازند.
پست های بعدی رو از دست ندید. 😍
#key
#flutter_key
#local_key
#global_key
1⃣
توی چند پست آینده در مورد key ها صحبت میکنیم.
انواع اون ها رو بررسی میکنیم و کاربرد هر کدومشون رو میگیم.
🔥توی فلاتر یه کلاس به اسم Key داریم که abstract هست و پایه و اساس کلاس های دیگه هست.
این کلاس دو نوع فرزند داره
LocalKey
GlobalKey
این ها کلاس هایی هستند که از Key ارث بری کردند و دو نوع مختلف Key رو با کاربرد های مختلف برای ما میسازند.
پست های بعدی رو از دست ندید. 😍
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
2⃣
🔥اولین نکته و اولین تفاوت این دو نوع Key رو از اسمشون میگیریم.
✔️کلید های global باید در کل اپ یکتا باشن ، یعنی اینکه اگه به یک ویجتی یه GlobalKey دادیم اون key رو دیگه نمیتونم به ویجت دیگه ای بدیم.
✔️اما LocalKey ها فقط در یک sub tree بررسی میشن یعنی اینکه میتونیم به دو تا ویجت LocalKey یکسان بدیم به شرط اینکه در یک sub tree نباشن.
🤔حالا اینکه این sub tree رو چگونه تحلیل کنیم و از کجا بفهمیم که کجاها مجاز نیستیم از LocalKey یکسان استفاده کنیم بستگی به مورد استفاده داره که به موقش در موردش صحبت میکنیم.
#key
#flutter_key
#local_key
#global_key
2⃣
🔥اولین نکته و اولین تفاوت این دو نوع Key رو از اسمشون میگیریم.
✔️کلید های global باید در کل اپ یکتا باشن ، یعنی اینکه اگه به یک ویجتی یه GlobalKey دادیم اون key رو دیگه نمیتونم به ویجت دیگه ای بدیم.
✔️اما LocalKey ها فقط در یک sub tree بررسی میشن یعنی اینکه میتونیم به دو تا ویجت LocalKey یکسان بدیم به شرط اینکه در یک sub tree نباشن.
🤔حالا اینکه این sub tree رو چگونه تحلیل کنیم و از کجا بفهمیم که کجاها مجاز نیستیم از LocalKey یکسان استفاده کنیم بستگی به مورد استفاده داره که به موقش در موردش صحبت میکنیم.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
3⃣
خب بریم سر وقت مهمترین تفاوت بین global ها و local ها :
🔥تفاوت اصلی اینجاست که GlobalKey ها حافظه دارن و LocalKey ها هیچ حافظه ای ندارن.
❓یعنی چی؟ وقتی که به یه ویجتی یه دونه GlobalKey اختصاص میدیم ، GlobalKey یه کار مهم میکنه و context ویجت رو توی خودش ذخیره میکنه (BuildContext).
✔️در نتیجه بعد از اون هر موقع و هر جایی با استفاده از اون key میتونیم به context ویجت دسترسی داشته باشیم و چون خود context هم اطلاعات دیگه از قبیل widget و State رو توی خودش داره میتونیم به اون ها هم دسترسی داشته باشیم.
✔️علاوه بر اون اگه اون ویجت توی درخت جابجا بشه و context اش تغییر کنه باز هم به context جدید دسترسی داریم.
🔥یه نکته هم بگیم که همه ویجت ها یه BuildContext اختصاصی برای خودشون دارن، همه ویجت ها و نه فقط استیت لس و استیت فول هایی که خودمون میسازیم.
همه ویجت شامل Text و Container و... یه BuildContext اختصاصی دارن که این context موقع ساخته شدن ویجت توی درخت ساخته میشه.
❌برخلاف global ها LocalKey هیچ حافظه ای نداره و هیچی توی خودش نگه نمیداره.
پس با توجه به این نکات :
✅ وقتی از GlobalKey استفاده میکنیم که بعدن و یه جای دیگه از برنامه نیاز داشته باشیم به context یا state یا خود اون widget دسترسی داشته باشیم.
✅وقتی از LocalKey ها استفاده میکنیم که فقط بخوایم به برچسب به اون ویجت بزنیم و با اون برچسب اون ویجت رو از بقیه متمایز کنیم.
🔥پس GlobalKey ها حافظه دارن و LocalKey ها صرفن یه برچسب هستن.
🔥البته GlobalKey ها علاوه بر داشتن حافظه میتونن کار برچسب گذاری (متمایز کردن) رو هم انجام بدن ولی اگه هدفمون فقط متمایز کردن ویجت از بقیه هست و نمیخایم بعدن یه جای دیگه به اطلاعاتش دسترسی داشته باشیم از LocalKey استفاده میکنیم.
#key
#flutter_key
#local_key
#global_key
3⃣
خب بریم سر وقت مهمترین تفاوت بین global ها و local ها :
🔥تفاوت اصلی اینجاست که GlobalKey ها حافظه دارن و LocalKey ها هیچ حافظه ای ندارن.
❓یعنی چی؟ وقتی که به یه ویجتی یه دونه GlobalKey اختصاص میدیم ، GlobalKey یه کار مهم میکنه و context ویجت رو توی خودش ذخیره میکنه (BuildContext).
✔️در نتیجه بعد از اون هر موقع و هر جایی با استفاده از اون key میتونیم به context ویجت دسترسی داشته باشیم و چون خود context هم اطلاعات دیگه از قبیل widget و State رو توی خودش داره میتونیم به اون ها هم دسترسی داشته باشیم.
✔️علاوه بر اون اگه اون ویجت توی درخت جابجا بشه و context اش تغییر کنه باز هم به context جدید دسترسی داریم.
🔥یه نکته هم بگیم که همه ویجت ها یه BuildContext اختصاصی برای خودشون دارن، همه ویجت ها و نه فقط استیت لس و استیت فول هایی که خودمون میسازیم.
همه ویجت شامل Text و Container و... یه BuildContext اختصاصی دارن که این context موقع ساخته شدن ویجت توی درخت ساخته میشه.
❌برخلاف global ها LocalKey هیچ حافظه ای نداره و هیچی توی خودش نگه نمیداره.
پس با توجه به این نکات :
✅ وقتی از GlobalKey استفاده میکنیم که بعدن و یه جای دیگه از برنامه نیاز داشته باشیم به context یا state یا خود اون widget دسترسی داشته باشیم.
✅وقتی از LocalKey ها استفاده میکنیم که فقط بخوایم به برچسب به اون ویجت بزنیم و با اون برچسب اون ویجت رو از بقیه متمایز کنیم.
🔥پس GlobalKey ها حافظه دارن و LocalKey ها صرفن یه برچسب هستن.
🔥البته GlobalKey ها علاوه بر داشتن حافظه میتونن کار برچسب گذاری (متمایز کردن) رو هم انجام بدن ولی اگه هدفمون فقط متمایز کردن ویجت از بقیه هست و نمیخایم بعدن یه جای دیگه به اطلاعاتش دسترسی داشته باشیم از LocalKey استفاده میکنیم.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
4️⃣
⛔️توی پست قبلی گفتیم که Globalkey ها حافظه دارن و Context ویجت رو توی خودشون ذخیره میکنن و بعدن با استفاده از اون میتونیم به context یا خود Widget یا State اون (در صورتی که ویجتی که key بهش اختصاص داده شده Stateful باشه) دسترسی پیدا کنیم و در مقابل LocalKey ها صرفن یه برچسب هستن.
اینجا یه نکته در مورد اون چیزی که واقعن داره اتفاق میوفته میگیم (Under the hood) , اگه زیاد علاقه ای ندارید میتونید از این نکته صرف نظر کنید.
🔥در واقع خود GlobalKey کار ذخیره Context رو انجام نمیده و Context ویجت توی خود GlobalKey ذخیره نمیشه.
❓پس کجا ذخیره میشه ؟
یه map وجود داره به شکل زیر
Map<GlobalKey , BuildContext> ـregistery
مپی که key های اون از جنس GlobalKey هستن و Value های اون از جنس BuildContext (البته دقیقن از جنس BuildContext نیستن ولی برای سادگی ما اینجا از نوع BuildContext در نظر میگیریم)
این مپ توی یه کلاسی که Element tree رو مدیریت میکنه وجود داره و وقتی که یه Element جدید ساخته میشه و mount میشه اگه key اختصاص داده شده به Widget اون Element از نوع Globalkey باشه یه عنصر به مپ اضافه میکنه :
_registery[gKey] = context;
اینجا gkey رو GlobalKey اختصاص داده شده به ویجت در نظر بگیرید و context رو هم buildContext ویجت.
وقتی هم که Element به اخر عمرش میرسه و unmount میشه این مپ اون عنصر رو حذف میکنه:
_registery.remove(gKey);
حالا خود کلاس GlobalKey به این مپ دسترسی داره و میتونه BuildContext متناظر با خودش رو پیدا کنه.
⛔️این نکته پیشرفته بود و سعی کردم که خیلی سادش کنم که بهتر متوجه بشید و برخی نکات خیلی ریز رو حذف کردم ولی میتونید ازش صرف نظر کنید.
#key
#flutter_key
#local_key
#global_key
4️⃣
⛔️توی پست قبلی گفتیم که Globalkey ها حافظه دارن و Context ویجت رو توی خودشون ذخیره میکنن و بعدن با استفاده از اون میتونیم به context یا خود Widget یا State اون (در صورتی که ویجتی که key بهش اختصاص داده شده Stateful باشه) دسترسی پیدا کنیم و در مقابل LocalKey ها صرفن یه برچسب هستن.
اینجا یه نکته در مورد اون چیزی که واقعن داره اتفاق میوفته میگیم (Under the hood) , اگه زیاد علاقه ای ندارید میتونید از این نکته صرف نظر کنید.
🔥در واقع خود GlobalKey کار ذخیره Context رو انجام نمیده و Context ویجت توی خود GlobalKey ذخیره نمیشه.
❓پس کجا ذخیره میشه ؟
یه map وجود داره به شکل زیر
Map<GlobalKey , BuildContext> ـregistery
مپی که key های اون از جنس GlobalKey هستن و Value های اون از جنس BuildContext (البته دقیقن از جنس BuildContext نیستن ولی برای سادگی ما اینجا از نوع BuildContext در نظر میگیریم)
این مپ توی یه کلاسی که Element tree رو مدیریت میکنه وجود داره و وقتی که یه Element جدید ساخته میشه و mount میشه اگه key اختصاص داده شده به Widget اون Element از نوع Globalkey باشه یه عنصر به مپ اضافه میکنه :
_registery[gKey] = context;
اینجا gkey رو GlobalKey اختصاص داده شده به ویجت در نظر بگیرید و context رو هم buildContext ویجت.
وقتی هم که Element به اخر عمرش میرسه و unmount میشه این مپ اون عنصر رو حذف میکنه:
_registery.remove(gKey);
حالا خود کلاس GlobalKey به این مپ دسترسی داره و میتونه BuildContext متناظر با خودش رو پیدا کنه.
⛔️این نکته پیشرفته بود و سعی کردم که خیلی سادش کنم که بهتر متوجه بشید و برخی نکات خیلی ریز رو حذف کردم ولی میتونید ازش صرف نظر کنید.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
5⃣
تقسیم بندی انواع key ها در فلاتر
✔️اون هایی که رنگ مشکی دارن abstract هستن و بقیه کلاس های معمولی هستن .
✔️اون هایی که با <T> مشخص شدن Generic هستن.
#key #local_key
#flutter_key #flutter_key
#value_key #object_key #unique_key
5⃣
تقسیم بندی انواع key ها در فلاتر
✔️اون هایی که رنگ مشکی دارن abstract هستن و بقیه کلاس های معمولی هستن .
✔️اون هایی که با <T> مشخص شدن Generic هستن.
#key #local_key
#flutter_key #flutter_key
#value_key #object_key #unique_key
⚡️⚡️Flutter Key⚡️⚡️
6️⃣ GlobalKey
در مورد GlobalKey ها باید بگیم ک:
✔️جنریک هستن و موقع نمونه سازی میتونیم واسشون یه Generic type مشخص کنیم. این Generic type باید از جنس State باشه.
درواقع اگه بخوایم GlobalKey رو به یه StatefulWidget اختصاص بدیم میتونیم براش type مشخص کنیم.
var key = GlobalKey<ScaffoldState>() ;
ویجت Scaffold یه StatefulWidget هست.
اگرم بخوایم به یه StatelessWidget یا... بدیمش هم میتونیم type مشخص نکنیم.
✔️یه پروپرتی (getter) به اسم currentContext دارن. (nullable)
✔️یه پروپرتی (getter) به اسم currentWidget دارن. (nullable)
✔️و یه پروپرتی هم به اسم currentState که type اش برابر type ای هست که برای GlobalKey مشخص کردیم.
گه اگه به ویجتی غیر از Stateful اختصاص بدیم این مقدار null برمیگردونه.
#key
#flutter_key
#local_key
#global_key
6️⃣ GlobalKey
در مورد GlobalKey ها باید بگیم ک:
✔️جنریک هستن و موقع نمونه سازی میتونیم واسشون یه Generic type مشخص کنیم. این Generic type باید از جنس State باشه.
درواقع اگه بخوایم GlobalKey رو به یه StatefulWidget اختصاص بدیم میتونیم براش type مشخص کنیم.
var key = GlobalKey<ScaffoldState>() ;
ویجت Scaffold یه StatefulWidget هست.
اگرم بخوایم به یه StatelessWidget یا... بدیمش هم میتونیم type مشخص نکنیم.
✔️یه پروپرتی (getter) به اسم currentContext دارن. (nullable)
✔️یه پروپرتی (getter) به اسم currentWidget دارن. (nullable)
✔️و یه پروپرتی هم به اسم currentState که type اش برابر type ای هست که برای GlobalKey مشخص کردیم.
گه اگه به ویجتی غیر از Stateful اختصاص بدیم این مقدار null برمیگردونه.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
8️⃣ GlobalKey
مثال )
میدونیم که وقتی که از MaterialApp استفاده میکنیم یه دونه Navigator برامون میسازه و توی درخت قراره میده.
بعد از اون هر موقع که بخوایم از نویگیتور استفاده کنیم میگیم :
Navigator.of(context)
❓این کد دقیقن چکار مکینه ؟
با استفاده از context ای که بهش دادیم شروع میکنه به جستجو توی درخت (از parent ویجت شروع میکنه) و میره بالا تا یه نویگتور توی درخت پیدا کنه و بعد state اون رو برمیگیردونه , یعنی خروجی این متد یه NavigatorState هست.
🔥ویجت Navigator یه StatefulWidget هست و یه state به نام NavigatorState داره و متد Navigator.of(context) یه NavigatorState برمیگردونه.
حالا بعد از اون میگیم
Navigator.of(context).push...
که این متد push و بقیه متد هایی که استفاده میکنیم متد هایی هستن که داخل NavigatorState تعریف شدن.
🔥🔥حالا به جای این کار میتونیم موقع ساخت MaterialApp یه پارامتر به اسم navigatorKey بهش بدیم. و توی این پارامتر یه GlobalKey بدیم. در نتیجه MaterialApp این key رو میده به Navigator و بعد از اون میتونیم ازش برای پیدا کردن NavigatorState استفاده کنیم :
var myNavKey = GlobalKey<NavigatorState>();
......
return MaterialApp(
navigatorKey: myNavKey,
.....
);
حالا به جای :
Navigator.of(context)
میگیم :
myNavKey.currentState.push...
🔥پس بدون نیاز به context تونستیم که نویگیت رو انجام بدیم.
🔥این کاری هست که پکیج GetX انجام میده.
#key
#flutter_key
#local_key
#global_key
8️⃣ GlobalKey
مثال )
میدونیم که وقتی که از MaterialApp استفاده میکنیم یه دونه Navigator برامون میسازه و توی درخت قراره میده.
بعد از اون هر موقع که بخوایم از نویگیتور استفاده کنیم میگیم :
Navigator.of(context)
❓این کد دقیقن چکار مکینه ؟
با استفاده از context ای که بهش دادیم شروع میکنه به جستجو توی درخت (از parent ویجت شروع میکنه) و میره بالا تا یه نویگتور توی درخت پیدا کنه و بعد state اون رو برمیگیردونه , یعنی خروجی این متد یه NavigatorState هست.
🔥ویجت Navigator یه StatefulWidget هست و یه state به نام NavigatorState داره و متد Navigator.of(context) یه NavigatorState برمیگردونه.
حالا بعد از اون میگیم
Navigator.of(context).push...
که این متد push و بقیه متد هایی که استفاده میکنیم متد هایی هستن که داخل NavigatorState تعریف شدن.
🔥🔥حالا به جای این کار میتونیم موقع ساخت MaterialApp یه پارامتر به اسم navigatorKey بهش بدیم. و توی این پارامتر یه GlobalKey بدیم. در نتیجه MaterialApp این key رو میده به Navigator و بعد از اون میتونیم ازش برای پیدا کردن NavigatorState استفاده کنیم :
var myNavKey = GlobalKey<NavigatorState>();
......
return MaterialApp(
navigatorKey: myNavKey,
.....
);
حالا به جای :
Navigator.of(context)
میگیم :
myNavKey.currentState.push...
🔥پس بدون نیاز به context تونستیم که نویگیت رو انجام بدیم.
🔥این کاری هست که پکیج GetX انجام میده.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
9️⃣ GlobalKey
❓آیا کاری که توی پست قبلی کردیم توی پرفرمانس تاثیر داره؟؟
😍😍صدردرصد بلههههه.
🔥🔥وقتی که از
Navigator.of
استفاده میکنیم شروع میکنه توی درخت حرکت کردن و به دنبال Navigator گشتن.
هرچه ویجت Navigator به ویجتی که داخلش این متد رو call کردیم نزدیکتر باشه این جستجو سریع تر انجام میشه و هر چقدر دورتر باشه زمان بیشتری میبره.
ولی وقتی از GlobalKey استفاده میکنیم دیگه نیازی به جستجو نیست و همون موقع در لحظه با استفاده از key میتونیم به NavigatorSate برسیم.
#key
#flutter_key
#local_key
#global_key
9️⃣ GlobalKey
❓آیا کاری که توی پست قبلی کردیم توی پرفرمانس تاثیر داره؟؟
😍😍صدردرصد بلههههه.
🔥🔥وقتی که از
Navigator.of
استفاده میکنیم شروع میکنه توی درخت حرکت کردن و به دنبال Navigator گشتن.
هرچه ویجت Navigator به ویجتی که داخلش این متد رو call کردیم نزدیکتر باشه این جستجو سریع تر انجام میشه و هر چقدر دورتر باشه زمان بیشتری میبره.
ولی وقتی از GlobalKey استفاده میکنیم دیگه نیازی به جستجو نیست و همون موقع در لحظه با استفاده از key میتونیم به NavigatorSate برسیم.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
1️⃣0️⃣ GlobalKey
🔥یه نکته مهم دیگه در مورد GlobalKey ها اینکه همیشه توی پروژتون یه کلاس برای مدیریت GlobalKey ها داشته باشید.
مثلن یه فولدر به اسم common داشته باشید و اونجا یه فایل به اسم keys.dart درست کنید و کلاس زیر رو داخلش بگذارید :
class Keys{
static final navigatorKey = GlobalKey<NavigatorState>();
}
هر GlobalKey که قراره توی پروژه استفاده بشه رو داخل این کلاس تعریف کنید و static کنید و هر جایی خواستید ازش استفاده کنید.
❌اگه خواستید یه GlobalKey خارج این کلاس تعریف کنید .
مثلن یه GlobalKey توی یه State تعریف کنید اصلن و به هیچ وجه اون رو توی متد build نسازید :
Widget build(BuildContext context){
final gKey = GlobalKey();
return Scaffold(key: gkey);
}
اصلن این کار رو نکنید , چون با هر بار rebuild شدن یه GlobalKey جدید و کاملن متفاوت از قبلی میسازه.
✅توی چنین مواردی GlobalKey رو قبل متد build و توی initState بهش مقدار بدید.
#key
#flutter_key
#local_key
#global_key
1️⃣0️⃣ GlobalKey
🔥یه نکته مهم دیگه در مورد GlobalKey ها اینکه همیشه توی پروژتون یه کلاس برای مدیریت GlobalKey ها داشته باشید.
مثلن یه فولدر به اسم common داشته باشید و اونجا یه فایل به اسم keys.dart درست کنید و کلاس زیر رو داخلش بگذارید :
class Keys{
static final navigatorKey = GlobalKey<NavigatorState>();
}
هر GlobalKey که قراره توی پروژه استفاده بشه رو داخل این کلاس تعریف کنید و static کنید و هر جایی خواستید ازش استفاده کنید.
❌اگه خواستید یه GlobalKey خارج این کلاس تعریف کنید .
مثلن یه GlobalKey توی یه State تعریف کنید اصلن و به هیچ وجه اون رو توی متد build نسازید :
Widget build(BuildContext context){
final gKey = GlobalKey();
return Scaffold(key: gkey);
}
اصلن این کار رو نکنید , چون با هر بار rebuild شدن یه GlobalKey جدید و کاملن متفاوت از قبلی میسازه.
✅توی چنین مواردی GlobalKey رو قبل متد build و توی initState بهش مقدار بدید.
#key
#flutter_key
#local_key
#global_key
⚡️⚡️Flutter Key⚡️⚡️
1️⃣1️⃣ GlobalKey
تا اینجا در مورد یکی از کاربرد های Globalkey به طور کامل صحبت کردیم و اون هم اختصاص GlobalKey به یه ویجت و دسترسی به context , state و خود widget در مکان های دیگه درخت بود.
ولی GlobalKey ها یه کاربرد مهم دیگه هم دارن.
🔥🔥با استفاده از GlobalKey میتونیم یه ویجت رو توی درخت جابجا کنیم (ویجت parent خودش رو تغییر بده) بدون اینکه اون ویجت state خودش رو از دست بده.
در مورد این کاربرد بعدن صحبت میکنیم.
#key
#flutter_key
#local_key
#global_key
1️⃣1️⃣ GlobalKey
تا اینجا در مورد یکی از کاربرد های Globalkey به طور کامل صحبت کردیم و اون هم اختصاص GlobalKey به یه ویجت و دسترسی به context , state و خود widget در مکان های دیگه درخت بود.
ولی GlobalKey ها یه کاربرد مهم دیگه هم دارن.
🔥🔥با استفاده از GlobalKey میتونیم یه ویجت رو توی درخت جابجا کنیم (ویجت parent خودش رو تغییر بده) بدون اینکه اون ویجت state خودش رو از دست بده.
در مورد این کاربرد بعدن صحبت میکنیم.
#key
#flutter_key
#local_key
#global_key
چند وقته دارت و فلاتر کار میکنید؟
Anonymous Poll
25%
کمتر از ۳ ماه
20%
۳ تا ۶ ماه
26%
۶ ماه تا یکسال
19%
یکسال تا دوسال
11%
بیشتر از دو سال