ورقة Dart المرجعية
آخر تحديث
Hello World وبنية البرنامج
كل برنامج Dart يبدأ من دالة main على المستوى الأعلى.
| العملية | الصياغة |
|---|---|
| نقطة الدخول | void main() { ... } |
| طباعة سطر | print("Hello, World!"); |
| استيفاء السلاسل النصية | print("Hi $name"); |
| تعبير في الاستيفاء | print("Sum: ${a + b}"); |
| تعليق | // this is a comment |
| تعليق متعدد الأسطر | /* ... */ |
| استيراد مكتبة | import 'dart:math'; |
| تشغيل ملف | dart run main.dart |
المتغيرات والأنواع
Dart ذات أنواع ساكنة لكن يمكنها استنتاج الأنواع بـ var.
| العملية | الصياغة |
|---|---|
| متغير مستنتَج | var age = 30; |
| نوع صريح | int age = 30; |
| ثابت وقت الترجمة | const pi = 3.14; |
| ثابت وقت التشغيل | final name = getName(); |
| الأنواع الأساسية | int, double, String, bool |
| النوع الديناميكي | dynamic x = 5; |
| تحويل النوع | int.parse("42"), n.toString() |
| فحص النوع | x is String, x as String |
أمان Null
الأنواع غير قابلة لأن تكون null افتراضيًا؛ أضِف ? للسماح بـ null.
| العملية | الصياغة |
|---|---|
| غير قابل لأن يكون null (افتراضي) | int count = 0; |
| نوع قابل لأن يكون null | String? name; |
| وصول واعٍ بـ null | user?.name |
| دمج null | name ?? "default" |
| إسناد بدمج null | name ??= "default"; |
| تأكيد عدم كونه null | name! |
| تهيئة متأخّرة | late String value; |
| نشر واعٍ بـ null | [...?maybeList] |
السلاسل النصية
السلاسل النصية تدعم علامات الاقتباس المفردة والمزدوجة والثلاثية.
| العملية | الصياغة |
|---|---|
| الطول | s.length |
| الأحرف الكبيرة / الصغيرة | s.toUpperCase(), s.toLowerCase() |
| الاستيفاء | "Total: $price" |
| الدمج | "foo" + "bar" |
| الاحتواء | s.contains("ell") |
| يبدأ / ينتهي بـ | s.startsWith("he") |
| التقسيم | "a,b,c".split(",") |
| الاستبدال | s.replaceAll("a", "b") |
| سلسلة فرعية | s.substring(0, 3) |
| إزالة المسافات | s.trim() |
المجموعات (List و Map و Set)
ثلاثة أنواع مجموعات أساسية بصياغة حرفية.
| العملية | الصياغة |
|---|---|
| قائمة حرفية | var nums = [1, 2, 3]; |
| الإضافة إلى قائمة | nums.add(4); |
| الوصول / الطول | nums[0], nums.length |
| Map / where | nums.map((n) => n * 2), nums.where((n) => n > 1) |
| خريطة حرفية | var ages = {"Ada": 30}; |
| الوصول إلى خريطة | ages["Ada"] |
| مجموعة حرفية | var ids = {1, 2, 3}; |
| عامل النشر (spread) | var all = [...a, ...b]; |
| if / for في المجموعة | [if (show) 1, for (n in xs) n] |
التحكم في التدفق
الشروط توضع بين أقواس؛ و switch تدعم الأنماط.
| العملية | الصياغة |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| الشرطي الثلاثي | var r = x > 0 ? "pos" : "neg"; |
| Switch | switch (n) { case 1: ...; default: ... } |
| حلقة for | for (var i = 0; i < 10; i++) { ... } |
| حلقة for-in | for (var item in items) { ... } |
| forEach | items.forEach((x) => print(x)); |
| حلقة while | while (x < 100) { ... } |
| Do-while | do { ... } while (x < 100); |
| Break / continue | break;, continue; |
الدوال
الدوال من الدرجة الأولى؛ وصياغة السهم تختصر التعبيرات المفردة.
| العملية | الصياغة |
|---|---|
| تعريف دالة | int add(int a, int b) { return a + b; } |
| دالة سهمية | int square(int x) => x * x; |
| موضعي اختياري | void log(String m, [int? code]) { ... } |
| معاملات مسمّاة | void box({int w = 0, int h = 0}) { ... } |
| مسمّى مطلوب | void box({required int w}) { ... } |
| دالة مجهولة الاسم | var f = (x) => x * 2; |
| التمرير كوسيط | nums.map((n) => n * 2) |
| Typedef | typedef IntOp = int Function(int); |
الأصناف والبواني
الأصناف تحمل الحالة والسلوك؛ والبواني تأتي بعدة أشكال.
| العملية | الصياغة |
|---|---|
| تعريف صنف | class Point { int x; int y; } |
| باني (constructor) | Point(this.x, this.y); |
| باني مسمّى | Point.origin() : x = 0, y = 0; |
| إنشاء نسخة | var p = Point(1, 2); |
| دالة | double dist() { ... } |
| Getter | int get area => w * h; |
| الوراثة | class Circle extends Shape { ... } |
| نداء super | super(args) |
| صنف مجرّد | abstract class Shape { ... } |
| تنفيذ واجهة | class Dog implements Animal { ... } |
غير المتزامن (Future / async-await)
الـ futures تمثّل قيمًا تتوفّر لاحقًا؛ و await يوقف التنفيذ حتى تُحلّ.
| العملية | الصياغة |
|---|---|
| دالة async | Future<int> load() async { ... } |
| انتظار future | var data = await load(); |
| إرجاع قيمة | return 42; داخل دالة async |
| تأخير | await Future.delayed(Duration(seconds: 1)); |
| معالجة الأخطاء | try { await load(); } catch (e) { ... } |
| تسلسل then | load().then((v) => print(v)); |
| التشغيل بالتوازي | await Future.wait([a(), b()]); |
| تدفّق غير متزامن | await for (var x in stream) { ... } |
صياغة Dart التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة Dart المرجعية هذه هي مرجع سريع للّغة الأساسية - المتغيرات والأنواع، وأمان null، والسلاسل النصية، والمجموعات، والتحكم في التدفق، والدوال، والأصناف، والـ futures و async/await التي تستخدمها لكتابة التطبيقات خلف Flutter.
كل ما هنا هو Dart قياسية تعمل على SDK الرسمية. انسخ ما تحتاجه، أو جرّب كل مقطع برمجي مباشرة في playground الخاص بـ Dart - دون الحاجة إلى أي تثبيت.
الأسئلة الشائعة حول ورقة Dart المرجعية
هل ورقة Dart المرجعية هذه مجانية؟
كيف يعمل أمان null في Dart؟
int count لا يمكن أن يحمل null أبدًا. وللسماح بـ null تضيف ? (String? name)، فيُجبرك المترجم حينها على معالجة حالة null. وتجعل المساعدات ذلك موجزًا: ?. للوصول الواعي بـ null، و ?? لقيمة احتياطية، و ! لتأكيد أن القيمة ليست null عندما تكون متيقّنًا. ويلتقط هذا أخطاء null في وقت الترجمة بدلًا من وقت التشغيل.ما هو الـ Future وكيف تعمل async و await؟
Future قيمة ستتوفّر لاحقًا، مثل نتيجة نداء شبكي. ووسم دالة بـ async يتيح لك استخدام await، الذي يوقف التنفيذ حتى يكتمل الـ future ثم يمنحك القيمة - فتكتب كودًا غير متزامن يُقرأ من الأعلى إلى الأسفل كأنه متزامن. غلّف الـ awaits بـ try/catch لمعالجة الأخطاء.