مقدمة عن 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
خطوات التثبيت:
- قم بتحميل Dart SDK من الموقع الرسمي
- أو استخدم Flutter SDK (يحتوي على Dart)
- ثبت Dart SDK على جهازك
- أضف Dart إلى PATH
- تحقق من التثبيت:
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');
}