متغیر یک مکان ذخیره سازی نامگذاری شده در یک برنامه است که می توانید مقداری را در آن ذخیره کنید. در دارت، متغیرها می توانند مقادیر مختلفی از جمله اعداد، رشته ها، بولی ها، لیست ها و اشیاء را در خود نگه دارند. نوع یک متغیر با داده هایی که در خود نگه می دارد تعیین می شود.
هر دو var و dynamic برای اعلام متغیرها در دارت استفاده می شوند، اما آنها رفتارهای متمایزی دارند و باید برای موقعیت های مختلف با دقت انتخاب شوند:
var
کاربرد: زمانی استفاده می شود که می خواهید کامپایلر نوع متغیر را بر اساس مقداری که به آن اختصاص داده شده تعیین کند.
رفتار: هنگامی که یک نوع تعریف می شود، ثابت می ماند و نمی توان آن را تغییر داد. تلاش برای تخصیص مقداری از نوع متفاوت باعث بروز خطا در برنامه می شود. سطحی از ایمنی نوع را در زمان کامپایل فراهم می کند زیرا کامپایلر نوع مقدار اختصاص داده شده را بررسی می کند.
var myString = "Hello"; // Inferred type is String
myString = 10; // Error: type mismatch -> Runtime error
dynamic
زمانی استفاده میشود که میدانید متغیر مقادیر مختلفی را در زمانهای مختلف نگه میدارد یا میخواهید بررسی نوع را در زمان کامپایل به طور کامل غیرفعال کنید. رفتار: اجازه می دهد تا هر نوع مقداری را به متغیر اختصاص دهیم. عدم ایمنی نوع در زمان کامپایل، خطاهای احتمالی در زمان اجرا در صورت استفاده از نوع ناسازگار. به دلیل عدم ایمنی نوع باید کم و با احتیاط استفاده شود.
انواع مختلفی از متغیرها در دارت
numbers:دارت از انواع مختلف اعداد مانند int، double و num پشتیبانی می کند. نوع int برای نمایش اعداد صحیح استفاده می شود، در حالی که نوع double برای نمایش اعداد ممیز شناور استفاده می شود. بسته به مقدار اختصاص داده شده از نوع num برای نمایش int یا double استفاده می شود.
Strings: در دارت از رشته ها برای نمایش داده های متنی استفاده می شود. رشته به دنباله ای از کاراکترها گفته می شود که می توانند در گیومه های تکی یا دوگانه قرار گیرند.
Booleans :برای نمایش مقادیر درست یا نادرست استفاده می شود. در دارت نوع بولی با کلمه کلیدی bool نشان داده می شود.
Lists: لیست مجموعه ای مرتب شده از اشیاء در دارت است. لیست ها با استفاده از براکت مربع ایجاد می شوند و می توانند شامل هر نوع اشیایی باشند.
Maps: نقشه ها برای مرتبط کردن کلیدها با مقادیر در دارت استفاده می شوند. آنها با استفاده از پرانتز های فرفری ایجاد می شوند و از مجموعه ای از جفت های کلید-مقدار تشکیل شده اند.
اعلان متغیرها در دارت
در Dart، متغیرها با استفاده از کلمه کلیدی var و به دنبال آن نام متغیر و یک نوع ( اختیاری) اعلام می شوند. به عنوان مثال، کد زیر متغیری به نام age را اعلام می کند و مقدار 30 را به آن اختصاص می دهد:
var age = 30;
اگر می خواهید نوع متغیر را به صراحت اعلام کنید، می توانید از نوع استفاده کنید. به عنوان مثال، کد زیر یک متغیر با نام از نوع String را اعلام می کند:
String name = 'John';
انواع دیگری از متغیرها در دارت وجود دارد، از جمله const و final .
متغیر final
متغیر final متغیری است که مقدار آن یک بار قابل تنظیم است و قابل تغییر نیست. هنگامی که یک مقدار را به یک متغیر final اختصاص می دهید، نمی توانید آن را تغییر دهید. برای اعلام یک متغیر final، از کلمه کلیدی final استفاده کنید. به عنوان مثال:
final int age = 30;
در مثال بالا، یک متغیر final به نام age را اعلام می کنیم و آن را با مقدار صحیح 30 مقداردهی اولیه می کنیم. پس از تخصیص، مقدار متغیر age را نمی توان تغییر داد.
متغیر های final را می توان در زمان اجرا مقدار دهی کرد .
می توانید متغیر final را اول تعریف و در جای دیگر مقداردهی کنید .
متغیرهای Const
متغیر const متغیری است که مقدار آن در زمان کامپایل مشخص است و در زمان اجرا قابل تغییر نیست. برای اعلام متغیر const از کلمه کلیدی const استفاده کنید. به عنوان مثال: const double pi = 3.14159; در مثال بالا، یک متغیر const به نام pi را اعلام می کنیم و آن را با مقدار ثابت ریاضی π مقداردهی اولیه می کنیم. پس از تخصیص، مقدار متغیر pi را نمی توان در زمان اجرا تغییر داد.
کار با متغیرها در دارت
هنگامی که یک متغیر را در Dart اعلام کردید، می توانید عملیات مختلفی را روی آن انجام دهید، مانند تخصیص مقادیر جدید، دستکاری مقدار یا مقایسه آن با مقادیر دیگر.
تخصیص مقادیر به متغیرها
برای تخصیص یک مقدار جدید به یک متغیر در Dart، به سادگی از عملگر انتساب = و سپس مقدار جدید استفاده کنید. به عنوان مثال:
var myAge = 30;
myAge = 31;
در مثال بالا، ابتدا یک متغیر myAge را اعلام می کنیم و آن را با مقدار صحیح 30 مقداردهی اولیه می کنیم. سپس یک مقدار جدید 31 را به همان متغیر اختصاص می دهیم.
Nullsafety
شما در یک کلاس هستید و معلمی وارد می شود و از دانش آموزی می خواهد که تکالیف را ارائه دهذ اما دانش آموز غایب است. معلم می تواند دانش آموز دیگری را برای انجام این کار فرا بخواند یا از کسی بخواهد که هر زمان که دانش آموز برگشت پیام تکلیف را به او منتقل کند. این مدلی برای رسیدگی به درخواست با گیرنده غایب است. این قیاس همچنین میتواند در کدهای ما مدلسازی شود که در آن یک متغیر میتواند در یک نقطه فراخوانی وجود نداشته باشد یا به یک مقدار در آن نقطه اختصاص داده شود. توانایی رسیدگی موثر به چنین مواردی برای هر توسعه دهنده بسیار مهم است.
معرفی Null Safety نقطه عطف مهمی برای زبان دارت است. Null Safety (امنیت پوچ) به شما کمک میکند تا از کل دسته مشکلات با گرفتن خطاهای تهی در طول توسعه و نه در زمان اجرا جلوگیری کنید.
Null
Null، به عنوان یک مفهوم برنامه نویسی، به سادگی به معنای “عدم مقدار” است. داشتن یک نوع داده برای نشان دادن این عدم وجود مفید است. بیایید سناریویی را در نظر بگیریم که در آن از افراد خواسته می شود نام کامل خود را در یک فرم پر کنند. ممکن است برخی از این افراد نام مستعار نداشته باشند. در موردی مانند این، میخواهیم عبارتی بسازیم که این فیلد میتواند حاوی مقدار String باشد یا اصلاً دادهای نداشته باشد. کلاس Null در Dart این مقدار null را ارائه می دهد. تصور کنید هیچ گزینه ای برای مقادیر تهی وجود ندارد، ما به سادگی می توانیم یک رشته خالی (“”) برای نشان دادن عدم وجود نام مستعار اختصاص دهیم ولی به کاربران باید اطلاع دهیم .
int capitalize(String middleName){
return middleName.toUpperCase();
}
تا زمانی که ما null را به عنوان یک مقدار در تابع capitalize ارسال نکنیم، به خوبی کار می کند. هنگامی که null را به عنوان پارامتری برای capitalize ارسال میکنیم، در Dart <2.12 (قبل از nullsafety)، کد در زمان کامپایل خطایی ایجاد نمیکند، اما اگر آن را اجرا کنیم، کد با یک خطا شکسته میشود.
NoSuchMethodError: The getter ‘length’ was called on null.
تا آنجا که ممکن است ما نمی خواهیم کاربرانمان این را ببینند و ممکن است نتوانیم آن را پیدا کنیم زیرا قبل از اجرای کد ظاهر نمی شود. به همین دلیل است که ما به nullsafety نیاز داریم. اگر همان کد بالا در نسخه Dart > 2.12 (یعنی نسخه nullsafety) نوشته شده باشد، هنگامی که null به عنوان آرگومان برای تابع capitalize ارسال می شود، فوراً یک خطا ایجاد می شود.
The argument type ‘Null’ can’t be assigned to the parameter type ‘String’
انواع داده هایNullable and Non-nullable
با ظهورnullsafety دارت به ما تضمین میکند که تمام انواع دادههای آن به طور پیشفرض غیر پوچ هستند. این به این معنی است که همه انواع دادهها باید مقداری داشته باشند، مگر اینکه بخواهیم غیر از این باشد (یعنی بخواهیم null باشد).
int myAge = 20;
bool userRegistered = true;
String myWord = “I love Flutter”;
Sport football = Sport(name: “Football”, players: 11);
اینجاست که انواع nullable دارت وارد می شود. برای nullable کردن یک نوع، تنها کاری که باید انجام دهیم این است که یک “؟” را جلوی نوع اضافه کنیم.
int? myAge = null; //This works
یک نوع nullable علاوه بر نوع اصلی، مقدار null را نیز مجاز میکند. این به این معنی است که نوع «?double» میتواند مقادیری مانند 1.42، 23.5، null، 0.005 و غیره داشته باشد.
?string یک نوع داده کاملاً متفاوت از String است.

اگر مقداریک متغیر nullable در ابتدا اختصاص داده نشود، به صورت پیش فرض null خواهد بود.
دارت مجموعه ای از عملگرها را برای کمک به مدیریت nullsafety فراهم می کند، این عملگرها به عنوان عملگرهای تهی شناخته می شوند.
عملگرهای تهی به شرح زیر هستند:
- عملگر if-null (??)
int? numberOfYears;
final age = numberOfYears ?? 0;
این به سادگی به صورت “اگر numberOfYears نال نیست، سن را برابر با numberOfYears و اگر null است، سن را برابر با 0 تنظیم کنید” خوانده می شود.
- عملگر دسترسی بدون آگاهی (?.)
int? age;
print(age?.isEven);
این را می توان به سادگی به این صورت توضیح داد: «اگر سن صفر است، null را برگردانید، در غیر این صورت اگر سن مقداری دارد، اگر زوج باشد یا نباشد، true/false را برگردانید».
اپراتور؟. باید زمانی استفاده شود که کاملاً مطمئن نیستیم که متغیر تهی خواهد بود یا خیر. از این رو، اگر معلوم شد که null است، به راحتی می توانیم آن را مدیریت کنیم، اگر هم تهی نباشد، مطابق با آن رفتار می کنیم.
- عملگر تهی (!)
برخلاف اپراتور Null aware access (?.)، هر زمان که مطمئن شدیم متغیری که مدیریت می کنیم قطعا تهی نیست، می توانیم از ! استفاده کنیم .
age!.isEven
در این مورد، ما می گوییم که “بله، من مطمئن هستم که سن صفر نخواهد بود، بنابراین فقط بررسی کنید که آیا زوج است”. اگرچه این هزینه دارد، زیرا اگر سن در نهایت پوچ شود، برنامه ما در زمان اجرا از کار می افتد. ! عملگر باید به عنوان یک عملگر خطرناک در نظر گرفته شود و تنها زمانی استفاده شود که مطمئن باشیم متغیر ما تهی نخواهد بود.
- عملگر انتساب بدون آگاهی (??=)
country = country ?? “Nigeria”;
می توانیم به طور خلاصه از ??= استفاده کنیم
country ??= “Nigeria”;
به زبان ساده، عملگر ??= به سادگی می گوید “اگر کشور تهی است، کشور را روی “نیجریه” تنظیم کنید، در غیر این صورت، مقدار فعلی کشور را حفظ کنید.
- عملگر cascade بدون آگاهی (?..)
در دارت، عملگر cascade (..) به ما اجازه می دهد تا چندین متد را در یک شیء یکسان فراخوانی کنیم یا به تنظیم چندین ویژگی روی یک شی کمک کنیم.
class Sport{
String? name;
int? players;
}
اگر کلاس Sport نال نباشد، میتوانیم عملگر cascade را به صورت زیر استفاده کنیم:
Sport sport = Sport()
..name = "Football"
..players = 11;
- عملگر (?[ ])
List<String> myColors = [“Blue”, “Green”, “Red”];
برای دسترسی به عناصر آرایه از indexing استفاده میکنیم .
ایندکس ها از 0 شروع می شوند، بنابراین برای فراخوانی “green”، این کار را انجام می دهیم:
var green = myColors[1];
امی دانیم که یک لیست ممکن است تهی باشد، بنابراین، برای دسترسی به عناصر آرایه به صورت naullsafety لیست، اپراتور کمکی ?[] داریم.
کلمه کلیدی Late در دارت
در دارت، از کلمه کلیدی late برای اعلام یک متغیر یا فیلدی استفاده می شود که در زمان بعدی مقداردهی اولیه می شود. late برای اعلام یک متغیر غیر قابل تهی که در زمان اعلان مقداردهی اولیه نشده است استفاده می شود.
// late variable
late String name;
void main() {
name = "John";
print(name);
}
Wildcard variables
یک متغیر عام با نام _ یک متغیر یا پارامتر محلی را غیر الزام آور اعلام می کند. در اصل، یک مکان نگهدار. مقداردهی اولیه، اگر وجود داشته باشد، هنوز اجرا می شود، اما مقدار قابل دسترسی نیست. چندین اعلان با نام _ می توانند در فضای نام یکسان بدون خطای برخورد وجود داشته باشند.
main() {
var _ = 1;
int _ = 2;
}