مقدمة عن Dart

ما هي Dart؟

Dart هي لغة برمجة كائنية التوجه طورتها Google، مصممة لبناء تطبيقات عالية الأداء على منصات متعددة.

مميزات Dart:
  • لغة حديثة: تصميم عصري وسهل التعلم
  • أداء عالي: يمكن تجميعها إلى كود JavaScript أو Native
  • منصة Flutter: اللغة الرسمية لتطوير تطبيقات Flutter
  • Type Safety: دعم قوي لأنواع البيانات
  • Async Support: دعم ممتاز للبرمجة غير المتزامنة
استخدامات Dart:
  • تطوير تطبيقات Flutter (Mobile, Web, Desktop)
  • تطوير تطبيقات الويب (compile to JavaScript)
  • تطوير تطبيقات الخوادم (Server-side)
  • Scripting و Automation
معلومة: Dart أصبحت شائعة بشكل كبير بعد إطلاق Flutter من Google.

تثبيت Dart SDK

خطوات التثبيت:

  1. قم بتحميل Dart SDK من الموقع الرسمي
  2. أو استخدم Flutter SDK (يحتوي على Dart)
  3. ثبت Dart SDK على جهازك
  4. أضف Dart إلى PATH
  5. تحقق من التثبيت: dart --version
بيئات التطوير:
  • VS Code: مع إضافة Dart
  • IntelliJ IDEA: مع Dart plugin
  • Android Studio: للعمل مع Flutter
  • Command Line: استخدام Terminal

أول برنامج Dart

إنشاء أول برنامج:

void main() {
  print('مرحباً بكم في Dart!');
  print('هذا أول برنامج لي');
}
شرح الكود:
  • void main(): دالة main هي نقطة بداية البرنامج
  • print(): أمر طباعة النص على الشاشة
  • ;: كل جملة يجب أن تنتهي بفاصلة منقوطة
تشغيل البرنامج:
dart run main.dart

المتغيرات وأنواع البيانات

أنواع البيانات في Dart:

// المتغيرات
String name = 'أحمد';
int age = 25;
double price = 99.99;
bool isActive = true;
var number = 10; // Type inference
dynamic value = 'Hello'; // يمكن تغيير النوع

// Constants
const pi = 3.14;
final currentTime = DateTime.now();
الفرق بين const و final:
  • const: قيمة ثابتة في وقت التجميع
  • final: قيمة ثابتة لكن يمكن تحديدها في وقت التشغيل

العمليات والمعاملات

المعاملات الحسابية:

int a = 10, b = 3;
print(a + b);  // 13
print(a - b);  // 7
print(a * b);  // 30
print(a / b);  // 3.333...
print(a ~/ b); // 3 (قسمة صحيحة)
print(a % b);  // 1 (الباقي)
print(a++);    // 10 (post-increment)
print(++a);    // 12 (pre-increment)
المعاملات المنطقية:
bool x = true, y = false;
print(x && y);  // false
print(x || y);  // true
print(!x);      // false

عبارات الشرط

if-else:

int age = 20;
if (age >= 18) {
  print('يمكنك التصويت');
} else {
  print('لا يمكنك التصويت');
}

// Ternary operator
String result = age >= 18 ? 'نعم' : 'لا';
switch:
String day = 'Monday';
switch (day) {
  case 'Monday':
    print('الاثنين');
    break;
  case 'Tuesday':
    print('الثلاثاء');
    break;
  default:
    print('يوم آخر');
}

الحلقات

for loop:

for (int i = 1; i <= 10; i++) {
  print(i);
}

// for-in
var list = [1, 2, 3, 4, 5];
for (var item in list) {
  print(item);
}
while و do-while:
int i = 1;
while (i <= 10) {
  print(i);
  i++;
}

do {
  print(i);
  i++;
} while (i <= 10);

القوائم Lists

List في Dart:

// إنشاء List
List<int> numbers = [1, 2, 3, 4, 5];
var names = ['أحمد', 'محمد', 'علي'];

// الوصول للعناصر
print(numbers[0]);  // 1
print(names.length); // 3

// إضافة عناصر
numbers.add(6);
numbers.insert(0, 0);

// حذف عناصر
numbers.remove(3);
numbers.removeAt(0);

// العمليات
numbers.forEach((n) => print(n));
var doubled = numbers.map((n) => n * 2).toList();

Maps و Sets

Map:

Map<String, int> ages = {
  'أحمد': 25,
  'محمد': 30,
  'علي': 28
};

ages['سارة'] = 22;
print(ages['أحمد']); // 25

ages.forEach((name, age) {
  print('$name: $age');
});
Set:
Set<int> numbers = {1, 2, 3, 4, 5};
numbers.add(6);
numbers.remove(3);
print(numbers.contains(2)); // true

الدوال Functions

تعريف الدوال:

// Function بسيطة
void greet(String name) {
  print('مرحباً $name');
}

// Function ترجع قيمة
int add(int a, int b) {
  return a + b;
}

// Arrow function
int multiply(int a, int b) => a * b;

// استدعاء
greet('أحمد');
int result = add(5, 3);

Optional Parameters

Named و Positional Parameters:

// Named parameters
void greet({String? name, int age = 0}) {
  print('مرحباً $name، العمر: $age');
}
greet(name: 'أحمد', age: 25);

// Positional optional
void info(String name, [int? age]) {
  print('$name ${age ?? 'غير محدد'}');
}
info('أحمد', 25);
info('محمد');

البرمجة الكائنية OOP

مفاهيم OOP في Dart:

  • Class: قالب لإنشاء الكائنات
  • Object: مثال من الكلاس
  • Encapsulation: إخفاء البيانات
  • Inheritance: الوراثة
  • Polymorphism: تعدد الأشكال

Classes و Objects

تعريف Class:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  void display() {
    print('$name - $age');
  }
}

// استخدام
var person = Person('أحمد', 25);
person.display();

Constructors

أنواع Constructors:

class Person {
  String name;
  int age;
  
  // Default constructor
  Person(this.name, this.age);
  
  // Named constructor
  Person.fromMap(Map map) {
    name = map['name'];
    age = map['age'];
  }
  
  // Factory constructor
  factory Person.create(String name) {
    return Person(name, 0);
  }
}

Inheritance

الوراثة:

class Animal {
  void eat() {
    print('الحيوان يأكل');
  }
}

class Dog extends Animal {
  void bark() {
    print('الكلب ينبح');
  }
}

var dog = Dog();
dog.eat();  // من Animal
dog.bark(); // من Dog

Mixins

استخدام Mixins:

mixin Flyable {
  void fly() {
    print('يطير');
  }
}

mixin Swimmable {
  void swim() {
    print('يسبح');
  }
}

class Duck with Flyable, Swimmable {
  void quack() {
    print('يصرخ');
  }
}

var duck = Duck();
duck.fly();
duck.swim();
duck.quack();

Abstract Classes

الكلاسات المجردة:

abstract class Shape {
  void draw(); // abstract method
}

class Circle extends Shape {
  @override
  void draw() {
    print('رسم دائرة');
  }
}

Interfaces

الواجهات:

abstract class Drawable {
  void draw();
}

class Rectangle implements Drawable {
  @override
  void draw() {
    print('رسم مستطيل');
  }
}

Exception Handling

try-catch-finally:

try {
  int result = 10 ~/ 0;
} on IntegerDivisionByZeroException {
  print('خطأ: القسمة على صفر');
} catch (e) {
  print('خطأ: $e');
} finally {
  print('تم التنفيذ');
}

Async و Await

البرمجة غير المتزامنة:

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'البيانات';
}

void main() async {
  var data = await fetchData();
  print(data);
}

Futures

استخدام Future:

Future<int> getNumber() {
  return Future.delayed(
    Duration(seconds: 1),
    () => 42
  );
}

getNumber().then((value) {
  print(value);
});

Streams

استخدام Streams:

Stream<int> countStream() async* {
  for (int i = 1; i <= 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() async {
  await for (var value in countStream()) {
    print(value);
  }
}

Generics

استخدام Generics:

class Box<T> {
  T value;
  Box(this.value);
}

var intBox = Box<int>(10);
var stringBox = Box<String>('Hello');

Enums

استخدام Enums:

enum Status { pending, approved, rejected }

void checkStatus(Status status) {
  switch (status) {
    case Status.pending:
      print('قيد الانتظار');
      break;
    case Status.approved:
      print('موافق');
      break;
    case Status.rejected:
      print('مرفوض');
      break;
  }
}

Extension Methods

Extension Methods:

extension StringExtension on String {
  String capitalize() {
    return '${this[0].toUpperCase()}${this.substring(1)}';
  }
}

void main() {
  String name = 'ahmed';
  print(name.capitalize()); // Ahmed
}

Packages و Imports

استخدام Packages:

// في pubspec.yaml
dependencies:
  http: ^0.13.0

// في الكود
import 'package:http/http.dart' as http;

void main() async {
  var response = await http.get(Uri.parse('https://api.example.com'));
  print(response.body);
}

Libraries

تنظيم الكود:

// math_utils.dart
library math_utils;

int add(int a, int b) => a + b;
int multiply(int a, int b) => a * b;

// main.dart
import 'math_utils.dart';

void main() {
  print(add(5, 3));
}

مشروع صغير

نظام إدارة طلاب:

class Student {
  String name;
  int age;
  double gpa;
  
  Student(this.name, this.age, this.gpa);
  
  void display() {
    print('$name - $age - $gpa');
  }
}

void main() {
  var students = [
    Student('أحمد', 20, 3.5),
    Student('محمد', 21, 3.8),
  ];
  
  students.forEach((s) => s.display());
}

Best Practices

أفضل الممارسات:

  • استخدم const للقيم الثابتة
  • استخدم final للقيم التي لا تتغير
  • استخدم null safety
  • استخدم async/await بدلاً من callbacks
  • نظم الكود في classes و libraries
  • استخدم meaningful names

مشروع تطبيقي كامل

نظام مكتبة:

class Book {
  String title;
  String author;
  bool available;
  
  Book(this.title, this.author, {this.available = true});
}

class Library {
  List<Book> books = [];
  
  void addBook(Book book) {
    books.add(book);
  }
  
  void borrowBook(String title) {
    var book = books.firstWhere((b) => b.title == title);
    if (book.available) {
      book.available = false;
      print('تم استعارة $title');
    }
  }
}

void main() {
  var library = Library();
  library.addBook(Book('Dart Programming', 'Author'));
  library.borrowBook('Dart Programming');
}