Dart — زبان برنامهنویسی از گوگل، که مخصوص فریمورک کراسپلتفرم Flutter ساخته شده است. این زبان کامپایل JIT برای بارگذاری داغ سریع و کامپایل AOT برای عملکرد بومی در نسخههای نهایی را ترکیب میکند. Dart نه تنها در توسعه موبایل، بلکه در برنامههای وب (AngularDart) و راهحلهای سرور نیز استفاده میشود. درباره قابلیتهای زبان بیشتر در مستندات رسمی Dart بخوانید.
نکات اصلی
Dart — زبان برنامهنویسی با نحوی شبیه C، توسعه یافته توسط گوگل به رهبری لارس باک (سازنده Eclipse). اولین انتشار در سال 2011 انجام شد، اما محبوبیت واقعی Dart در سال 2018 با عرضه Flutter 1.0 به دست آمد. این زبان برای ایجاد رابطهای کاربری طراحی شده است: پشتیبانی داخلی از استریمها، فیوچرها و الگوهای واکنشگرا دارد.
فلسفه Dart — "تعادل عملکرد و بهرهوری". این زبان از دو استراتژی کامپایل پشتیبانی میکند: JIT (Just-In-Time) برای توسعه با بارگذاری داغ و AOT (Ahead-Of-Time) برای نسخههای نهایی با عملکرد بومی. کامپایلر JIT کد تغییر یافته را در میلیثانیه به برنامه در حال اجرا تزریق میکند، بدون نیاز به کامپایل مجدد APK — این مزیت کلیدی Dart نسبت به سایر زبانها در زمینه توسعه موبایل است.
ویژگی کلیدی Dart — sound null safety، معرفی شده در Dart 2.12 (2021). سیستم نوع تضمین میکند که متغیر بدون ذکر صریح (int?) نمیتواند null باشد. این کار NullPointerException را در مرحله کامپایل حذف میکند. طبق دادههای گوگل، پیادهسازی null safety تعداد کرشها را در برنامههای Flutter در محیط تولید 30% کاهش داد.
اکوسیستم Dart سه جهت اصلی را شامل میشود: Flutter (برنامههای موبایل و دسکتاپ)، AngularDart (برنامههای وب) و Dart Server (راهحلهای سرور). Flutter — پلتفرم غالب: طبق دادههای Statista (2025)، Flutter در 46% پروژههای موبایل کراسپلتفرم استفاده میشود، پیشتاز از React Native (38%) و Xamarin (8%).
نحو Dart شبیه Java و JavaScript است، اما ساختارهای منحصر به فرد خود را دارد. همه چیز در Dart یک شیء است — حتی int، double و bool از Object ارث میبرند. تایپ کردن اختیاری است: متغیر اعلام شده با var به طور خودکار نوع را استنباط میکند، اما برای خوانایی و عملکرد توصیه میشود انواع را صریحاً مشخص کنید.
Dart از int، double، String، bool، List، Set، Map، Record، Symbol و Runes پشتیبانی میکند. نوع Nullable — هر نوع با پسوند ? (int?, String?). عملگر ?? (null-aware) اگر سمت چپ null باشد مقدار سمت راست را برمیگرداند. نشانهگذاری آبشاری (..) امکان فراخوانی چندین روش روی یک شیء بدون تکرار مرجع را فراهم میکند.
// انواع پایه و اعلامها در Dart
void main() {
// تایپ صریح
int age = 25;
double price = 19.99;
String name = 'Dart';
bool isValid = true;
// Null safety — متغیر میتواند null باشد
int? nullableAge = null;
int result = nullableAge ?? 0; // عملگر null-aware
// مجموعهها با جنریکها
List<String> items = ['Dart', 'Flutter', 'Mobile'];
Map<String, dynamic> config = {
'version': '3.0',
'mode': 'debug',
};
// نشانهگذاری آبشاری
final list = <String>[]
..add('one')
..add('two')
..sort();
}
// Record — نوع ناشناس تغییرناپذیر
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'نوع dynamic بررسی نوع را غیرفعال میکند — فقط هنگام کار با JSON یا دادههای پویا از آن استفاده کنید. Record — نوع جدید در Dart 3.0، امکان گروهبندی مقادیر بدون ایجاد کلاس جداگانه را میدهد. عملگر null-aware ?? — روش استاندارد کار با مقادیر nullable، جایگزین بررسیهای طولانی if-else.
کلاسها در Dart — وراثت تکی (extends)، چندگانه از طریق میکسینها (mixin). Dart از اینترفیس به عنوان یک مفهوم جداگانه پشتیبانی نمیکند — هر کلاسی میتواند پیادهسازی شود (implements). میکسین — کلاسی بدون سازنده که روشها و فیلدهای آن میتوانند از طریق کلمه کلیدی with به هر کلاسی اضافه شوند.
// کلاسها، وراثت و میکسینها در Dart
abstract class Animal {
void sound(); // روش انتزاعی
}
mixin Swimmer {
void swim() => print('Swimming...');
}
mixin Flyer {
void fly() => print('Flying...');
}
class Duck extends Animal with Swimmer, Flyer {
@override
void sound() => print('Quack!');
}
void main() {
final duck = Duck();
duck.sound(); // Quack!
duck.swim(); // Swimming...
duck.fly(); // Flying...
}
// سازنده نامدار
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}کلاس Duck از Animal ارث میبرد و از دو میکسین — Swimmer و Flyer استفاده میکند. این وراثت چندگانه را بدون مشکلات ساختار لوزی نشان میدهد: میکسینها به صورت خطی حل میشوند (super chain). سازندههای نامدار (Config.development) — جایگزینی برای روشهای کارخانهای استاتیک برای ایجاد اشیاء با پارامترهای از پیش تعیین شده.
ناهمگامی در Dart از طریق Future (مقدار تکی)، Stream (توالی مقادیر) و async/await پیادهسازی شده است. Dart از مدل event loop تکنخی مشابه JavaScript استفاده میکند، اما با تفاوت مهم: محاسبات طولانی UI را مسدود نمیکنند، زیرا کد Dart در Isolate — نخ جداگانه بدون حافظه مشترک اجرا میشود.
Future یک عملیات ناهمگام را نشان میدهد که پس از مدتی تکمیل میشود. Future میتواند در حالت pending (انتظار)، completed with value (موفقیت) یا completed with error (خطا) باشد. زنجیره .then().catchError() — جایگزینی برای async/await، اما برای خوانایی استفاده از await توصیه میشود.
// بارگذاری ناهمگام داده با Future و Stream
import 'dart:convert';
import 'package:http/http.dart' as http;
class ApiService {
final String baseUrl;
ApiService(this.baseUrl);
// Future برای درخواست تکی
Future<Map<String, dynamic>> fetchUser(int id) async {
final response = await http.get(
Uri.parse('$baseUrl/users/$id'),
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to load user: ${response.statusCode}');
}
}
// Stream برای توالی دادهها
Stream<int> countStream(int max) async* {
for (var i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
void main() async {
final api = ApiService('https://api.example.com');
// استفاده از await
final user = await api.fetchUser(1);
print('User: ${user['name']}');
// پردازش Stream با await for
await for (final count in api.countStream(5)) {
print('Count: $count');
}
}کلاس ApiService دو نوع ناهمگامی را نشان میدهد: Future برای درخواست HTTP (یک پاسخ) و Stream برای شمارنده ترتیبی (مولد با async* و yield). Stream برای کار با سنسورها، موقعیتیابی، Firebase Realtime Database — هر جا که دادهها به طور پیوسته وارد میشوند، مؤثر است. Isolate از حافظه جداگانه استفاده میکند — دادهها از طریق SendPort/ReceivePort منتقل میشوند.
Dart و Flutter یک پشته واحد تشکیل میدهند: Flutter — فریمورک UI، Dart — زبان توصیف UI. در Flutter همه چیز یک ویجت است (Widget) — از دکمه تا کل برنامه. ویجتها میتوانند stateful (با حالت قابل تغییر) و stateless (تغییرناپذیر) باشند. Dart UI اعلامی را توصیف میکند: build() درختی از ویجتها را برمیگرداند که Flutter با Skia (یا Impeller در iOS) رندر میکند.
برنامه Flutter در Dart از main() → runApp(MyApp()) → MaterialApp تشکیل شده است. MaterialApp شامل مسیریابی (routes)، تم (theme) و بومیسازی است. هر صفحه — Scaffold شامل AppBar، Body (معمولاً Column/ListView) و BottomNavigationBar. ناوبری از طریق Navigator.push/pop یا مسیرهای نامدار.
// برنامه ساده Flutter در Dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dart + Flutter')),
body: Center(
child: Text('Counter: $_counter'),
),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: Icon(Icons.add),
),
);
}
}ویجت HomeScreen — StatefulWidget با حالت داخلی _counter. فراخوانی setState() به Flutter اطلاع میدهد که نیاز به بازسازی UI است — کد Dart build() را مجدداً راهاندازی میکند و درخت جدیدی از ویجتها ایجاد میکند. Flutter درخت قدیم و جدید را به طور مؤثر مقایسه میکند (diff) و فقط بخشهای تغییر یافته صفحه را بهروز میکند. Hot Reload build() را بدون بازنشانی حالت _counter جایگزین میکند.
کامپایل Dart — ترکیبی: JIT برای توسعه و AOT برای تولید. در حالت اشکالزدایی، Dart VM کامپایلر JIT را راهاندازی میکند که بایتکد را با امکان جایگزینی داغ کد تفسیر میکند. در نسخه نهایی dart compile exe یا flutter build یک باینری AOT بومی برای معماری خاص (arm64، x86_64، armv7) ایجاد میکند.
| حالت | کامپایل | سرعت اجرا | اندازه باینری | Hot Reload |
|---|---|---|---|---|
| Debug | JIT (VM) | متوسط | ~50 مگابایت | بله |
| Release | AOT (Native) | حداکثر | ~15-20 مگابایت | خیر |
| Web | dart2js | بستگی به مرورگر دارد | متغیر | سرور توسعه |
کامپایل JIT Dart در حالت اشکالزدایی بارگذاری داغ را در حدود ~1 ثانیه فراهم میکند — توسعهدهنده تغییرات UI را بدون از دست دادن حالت برنامه میبیند. کامپایل AOT عملکرد نزدیک به برنامههای بومی Swift/Kotlin را ارائه میدهد. طبق دادههای گوگل، Flutter بر روی Dart AOT حتی در دستگاههای میانرده به 60 FPS انیمیشن میرسد.
ابزارهای توسعهدهنده Dart شامل Dart SDK (کامپایلر dart، dartanalyzer، dartfmt، pub)، Flutter SDK و پلاگینهای IDE است. Dart SDK همراه با Flutter SDK در پوشه flutter/bin/cache/dart-sdk نصب میشود. Pub — مدیر بسته، فایل pubspec.yaml را میخواند و وابستگیها را از pub.dev دریافت میکند.
dart analyze — تحلیلگر ایستا که انواع، importهای استفاده نشده و خطاهای بالقوه را بررسی میکند. dart format — فرمتکننده، که به طور خودکار کد را به یک سبک واحد تبدیل میکند. dart doc — مولد مستندات از کامنتهای ///. Flutter DevTools — پروفایلر با نمایش درخت ویجتها، لاگها، حافظه و شبکه. Dart VM Service — اشکالزدایی برنامه در حال اجرا از طریق WebSocket.
# pubspec.yaml — پیکربندی پروژه Dart
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
http: ^1.2.0
provider: ^6.1.0
shared_preferences: ^2.2.0
json_annotation: ^4.8.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.0
json_serializable: ^6.7.0
flutter_lints: ^3.0.0فایل pubspec.yaml وابستگیهای پروژه Dart را توصیف میکند. فیلد environment:sdk نسخه Dart را مشخص میکند — نسخه پایدار فعلی 3.x. Dependencies — کتابخانههای اصلی، dev_dependencies — برای تست و تولید کد. json_annotation + json_serializable کد را برای سریالسازی JSON از طریق build_runner تولید میکنند. flutter_lints — مجموعه قوانین برای تحلیلگر.
سوالات متداول
Dart — زبان برنامهنویسی از گوگل (2011)، طراحی شده برای توسعه کراسپلتفرم روی Flutter. از نحوی شبیه C، تایپ قوی، کامپایل JIT و AOT پشتیبانی میکند. با sound null safety (از Dart 2.12) و ناهمگامی از طریق Future و Stream متمایز میشود. برای برنامههای موبایل، وب و دسکتاپ استفاده میشود.
Dart به کد بومی (AOT) یا JS (dart2js) کامپایل میشود، JavaScript تفسیر میشود. Dart دارای تایپ قوی با sound null safety، کلاسهای داخلی و میکسینها است. ناهمگامی Dart بر اساس Isolate (نخهای جداگانه بدون حافظه مشترک) ساخته شده است، JS — بر اساس event loop با Web Workers. عملکرد Dart AOT 30-50% بالاتر از V8 JIT در سناریوهای موبایل است.
Dart از طریق Dart Native با AOT به کد ARM بومی کامپایل میشود. در حالت اشکالزدایی Dart VM از JIT با بارگذاری داغ استفاده میکند. Flutter Engine (C++) UI را از طریق Skia/Impeller رندر میکند. برای اندروید — flutter build apk، برای iOS — flutter build ios. کامپایل وب از dart2js یا dart2wasm استفاده میکند. اندازه APK نهایی — 15-20 مگابایت (بدون تقسیم AAB).
Dart از انواع ابتدایی: int، double، String، bool پشتیبانی میکند. مجموعهها: List، Set، Map، Record. ویژه: Symbol، Runes، Null. همه چیز شیء است، از جمله انواع ابتدایی. Null safety: نوع int? اجازه null میدهد، int — هرگز null. عملگرهای ??، ??= برای کار ایمن با null. جنریکها: List<String>، Map<String, dynamic>.
Flutter SDK شامل Dart SDK، Flutter Engine و کتابخانه ویجتها است. IDE — Android Studio یا VS Code با پلاگین Flutter. DevTools — پروفایلر با بازرس ویجتها. Pub.dev — مدیر بسته با 45 000+ کتابخانه. تحلیلگر dart analyze و فرمتکننده dart format — برای کیفیت کد. Build_runner — برای تولید مدلهای JSON.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.