Dart: این چیست، ویژگی‌های زبان Flutter و برنامه‌نویسی

نویسنده: IT Sectr منتشر شده: 2026-02-10 زمان مطالعه: 12 دقیقه

Dart — زبان برنامه‌نویسی از گوگل، که مخصوص فریم‌ورک کراس‌پلتفرم Flutter ساخته شده است. این زبان کامپایل JIT برای بارگذاری داغ سریع و کامپایل AOT برای عملکرد بومی در نسخه‌های نهایی را ترکیب می‌کند. Dart نه تنها در توسعه موبایل، بلکه در برنامه‌های وب (AngularDart) و راه‌حل‌های سرور نیز استفاده می‌شود. درباره قابلیت‌های زبان بیشتر در مستندات رسمی Dart بخوانید.

نکات اصلی

  • Dart — زبان Flutter ساخته شده توسط گوگل، با کامپایل JIT/AOT
  • Null safety — sound null safety از Dart 2.12 عدم وجود خطاهای null را تضمین می‌کند
  • Isolate — هم‌روندی از طریق نخ‌های ایزوله بدون حافظه مشترک
  • Flutter — فریم‌ورک UI که ویجت‌ها را از طریق Skia/Impeller رندر می‌کند
  • Pub.dev — مدیر بسته با 45 000+ کتابخانه برای Dart و Flutter

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

اکوسیستم Dart سه جهت اصلی را شامل می‌شود: Flutter (برنامه‌های موبایل و دسکتاپ)، AngularDart (برنامه‌های وب) و Dart Server (راه‌حل‌های سرور). Flutter — پلتفرم غالب: طبق داده‌های Statista (2025)، Flutter در 46% پروژه‌های موبایل کراس‌پلتفرم استفاده می‌شود، پیش‌تاز از React Native (38%) و Xamarin (8%).

نحو Dart: انواع، توابع و کلاس‌ها

نحو 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
// انواع پایه و اعلام‌ها در 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
// کلاس‌ها، وراثت و میکسین‌ها در 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 از طریق 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 توصیه می‌شود.

dart
// بارگذاری ناهمگام داده با 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: معماری برنامه

Dart و Flutter یک پشته واحد تشکیل می‌دهند: Flutter — فریم‌ورک UI، Dart — زبان توصیف UI. در Flutter همه چیز یک ویجت است (Widget) — از دکمه تا کل برنامه. ویجت‌ها می‌توانند stateful (با حالت قابل تغییر) و stateless (تغییرناپذیر) باشند. Dart UI اعلامی را توصیف می‌کند: build() درختی از ویجت‌ها را برمی‌گرداند که Flutter با Skia (یا Impeller در iOS) رندر می‌کند.

ساختار برنامه Flutter

برنامه Flutter در Dart از main() → runApp(MyApp()) → MaterialApp تشکیل شده است. MaterialApp شامل مسیریابی (routes)، تم (theme) و بومی‌سازی است. هر صفحه — Scaffold شامل AppBar، Body (معمولاً Column/ListView) و BottomNavigationBar. ناوبری از طریق Navigator.push/pop یا مسیرهای نام‌دار.

dart
// برنامه ساده 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 — ترکیبی: JIT برای توسعه و AOT برای تولید. در حالت اشکال‌زدایی، Dart VM کامپایلر JIT را راه‌اندازی می‌کند که بایت‌کد را با امکان جایگزینی داغ کد تفسیر می‌کند. در نسخه نهایی dart compile exe یا flutter build یک باینری AOT بومی برای معماری خاص (arm64، x86_64، armv7) ایجاد می‌کند.

حالتکامپایلسرعت اجرااندازه باینریHot Reload
DebugJIT (VM)متوسط~50 مگابایتبله
ReleaseAOT (Native)حداکثر~15-20 مگابایتخیر
Webdart2jsبستگی به مرورگر داردمتغیرسرور توسعه

کامپایل JIT Dart در حالت اشکال‌زدایی بارگذاری داغ را در حدود ~1 ثانیه فراهم می‌کند — توسعه‌دهنده تغییرات UI را بدون از دست دادن حالت برنامه می‌بیند. کامپایل AOT عملکرد نزدیک به برنامه‌های بومی Swift/Kotlin را ارائه می‌دهد. طبق داده‌های گوگل، Flutter بر روی Dart AOT حتی در دستگاه‌های میان‌رده به 60 FPS انیمیشن می‌رسد.

ابزارهای توسعه‌دهنده Dart

ابزارهای توسعه‌دهنده 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.

yaml
# 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 چیست؟

Dart — زبان برنامه‌نویسی از گوگل (2011)، طراحی شده برای توسعه کراس‌پلتفرم روی Flutter. از نحوی شبیه C، تایپ قوی، کامپایل JIT و AOT پشتیبانی می‌کند. با sound null safety (از Dart 2.12) و ناهمگامی از طریق Future و Stream متمایز می‌شود. برای برنامه‌های موبایل، وب و دسکتاپ استفاده می‌شود.

تفاوت Dart با JavaScript چیست؟

Dart به کد بومی (AOT) یا JS (dart2js) کامپایل می‌شود، JavaScript تفسیر می‌شود. Dart دارای تایپ قوی با sound null safety، کلاس‌های داخلی و میکسین‌ها است. ناهمگامی Dart بر اساس Isolate (نخ‌های جداگانه بدون حافظه مشترک) ساخته شده است، JS — بر اساس event loop با Web Workers. عملکرد Dart AOT 30-50% بالاتر از V8 JIT در سناریوهای موبایل است.

چگونه Dart به برنامه موبایل کامپایل می‌شود؟

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 از چه نوع داده‌هایی پشتیبانی می‌کند؟

Dart از انواع ابتدایی: int، double، String، bool پشتیبانی می‌کند. مجموعه‌ها: List، Set، Map، Record. ویژه: Symbol، Runes، Null. همه چیز شیء است، از جمله انواع ابتدایی. Null safety: نوع int? اجازه null می‌دهد، int — هرگز null. عملگرهای ??، ??= برای کار ایمن با null. جنریک‌ها: List<String>، Map<String, dynamic>.

برای توسعه Dart به چه ابزارهایی نیاز است؟

Flutter SDK شامل Dart SDK، Flutter Engine و کتابخانه ویجت‌ها است. IDE — Android Studio یا VS Code با پلاگین Flutter. DevTools — پروفایلر با بازرس ویجت‌ها. Pub.dev — مدیر بسته با 45 000+ کتابخانه. تحلیلگر dart analyze و فرمت‌کننده dart format — برای کیفیت کد. Build_runner — برای تولید مدل‌های JSON.

خلاصه

  • Dart — زبان گوگل برای Flutter، ترکیب توسعه JIT و عملکرد AOT
  • Sound null safety از Dart 2.12 (+3.0) — حفاظت اجباری از null در سطح نوع
  • ناهمگامی از طریق Future (نتیجه تکی)، Stream (توالی)، Isolate (هم‌روندی)
  • Flutter — فریم‌ورک UI اعلامی، جایی که همه چیز ویجت است (StatelessWidget / StatefulWidget)
  • Hot Reload — بارگذاری مجدد JIT در ~1 ثانیه بدون از دست دادن حالت برنامه
  • Pub.dev — اکوسیستم بسته (45 000+)، مدیریت شده از طریق pubspec.yaml
  • Flutter DevTools — پروفایلر با بازرس ویجت‌ها، حافظه و شبکه

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید