Null-aware operators
?. و ?? دسترسی و مقدار پیشفرض را بدون شاخهٔ اضافی میسازند.
String displayName(User? user) { final name = user?.name.trim(); return name == null || name.isEmpty ? 'Guest' : name;}
راهنمای Dart برای تعریف نوع، collection، توابع، null safety و عملیات async. nullable بودن را در نوعها بیان کنید و از force unwrap بیدلیل بپرهیزید. مدل immutable رفتار قابلپیشبینیتری دارد. collectionهای typed خطاهای نوع را زود آشکار میکنند. switch expression برای حالتهای محدود، نتیجهٔ exhaustive و قابلفهم میسازد. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
?. و ?? دسترسی و مقدار پیشفرض را بدون شاخهٔ اضافی میسازند.
String displayName(User? user) { final name = user?.name.trim(); return name == null || name.isEmpty ? 'Guest' : name;}پارامترهای نامدار فراخوانی را روشنتر میکنند.
String greet({required String name, String prefix = 'Hello'}) { return '$prefix, $name';}constructor نامدار میتواند ساخت نمونه را معناییتر کند.
class User { const User({required this.id, required this.name}); final int id; final String name;}collection literalها شرط و گسترش مجموعه را پشتیبانی میکنند.
final visibleItems = [ ...featuredItems, if (showRecent) ...recentItems,];زنجیرهٔ iterable را برای فیلتر و نگاشت داده استفاده کنید.
final names = users .where((user) => user.isActive) .map((user) => user.name) .toList();switch expression در حالتهای enum باید همهٔ شاخهها را پوشش دهد.
final label = switch (status) { Status.ready => 'Ready', Status.loading => 'Loading', Status.failed => 'Failed',};خطای Future در try/catch فراخوانندهٔ async قابلرسیدگی است.
Future<User> loadUser(int id) async { final response = await client.get('/users/$id'); return User.fromJson(response.data);}کارهای مستقل را همزمان اجرا و پس از تکمیل جمعآوری کنید.
final results = await Future.wait([ loadProfile(userId), loadPreferences(userId),]);subscription را در پایان lifecycle لغو کنید.
late final StreamSubscription<int> subscription;void start(Stream<int> values) { subscription = values.listen(handleValue, onError: reportError);}Future<void> stop() => subscription.cancel();متغیر قابلتغییر را با var یا نوع صریح و مقدار ثابت را با final بسازید.
مقدار کامپایلتایم ثابت را با const تعریف کنید.
نوع nullable را با ? نشان دهید و پیش از مصرف null را کنترل کنید.
لیست، set و map را با نوع عناصر مشخص تعریف کنید.
تابع پیکانی کوتاه: int double(int value) => value * 2;
پارامترهای نامدار را برای فراخوانی خواناتر بهکار ببرید.
عملیات ناهمگام را با Future<T>، async و await بنویسید.
جریان داده را با Stream<T> مدل و subscription را مدیریت کنید.
الگوی sealed و switch exhaustive را برای حالتهای محدود بهکار ببرید.
قالببندی را با dart format و تحلیل را با dart analyze اجرا کنید.
null safety را در نوعها صریح کنید؛ ! فقط وقتی استفاده شود که non-null بودن واقعاً تضمین شده است.
Future را برای یک نتیجهٔ ناهمگام و Stream را برای دنبالهٔ چند رویداد انتخاب کنید و subscription را مدیریت کنید.