Dart: какво е това, характеристики на езика Flutter и програмиране

Автор: IT Sectr Публикувано: 2026-02-10 Време за четене: 12 мин

Dart — език за програмиране от Google, създаден специално за крос-платформената рамка Flutter. Той съчетава JIT компилация за светкавично горещо презареждане и AOT компилация за естествена производителност в release сборките. Dart се използва не само в мобилната разработка, но и за уеб приложения (AngularDart) и сървърни решения. Прочетете повече за възможностите на езика в официалната документация на Dart.

Основни точки

  • Dart — езикът на Flutter, създаден от Google, с JIT/AOT компилация
  • Null safety — sound null safety от Dart 2.12 гарантира липса на null грешки
  • Isolate — паралелизъм чрез изолирани нишки без споделена памет
  • Flutter — UI рамка, която рендерира widgets чрез Skia/Impeller
  • Pub.dev — мениджър на пакети с 45 000+ библиотеки за Dart и Flutter

Какво е Dart?

Dart — език за програмиране с C-подобен синтаксис, разработен от Google под ръководството на Ларс Бак (създателя на Eclipse). Първото издание беше през 2011 г., но истинска популярност Dart придоби през 2018 г. с пускането на Flutter 1.0. Езикът е проектиран за създаване на потребителски интерфейси: има вградена поддръжка за streams, futures и реактивни модели.

Философията на Dart — "баланс между производителност и продуктивност". Езикът поддържа две стратегии за компилация: JIT (Just-In-Time) за разработка с горещо презареждане и AOT (Ahead-Of-Time) за release сборки с естествена производителност. JIT компилаторът инжектира променен код в работещото приложение за милисекунди, без да изисква прекомпилиране на APK — това е ключовото предимство на Dart пред другите езици в контекста на мобилната разработка.

Ключовата характеристика на Dart — sound null safety, въведена в Dart 2.12 (2021). Системата от типове гарантира, че променлива не може да бъде null без изрично посочване (int?). Това елиминира NullPointerException на етапа на компилация. Според данни на Google, въвеждането на 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 (Widget) — от бутон до цялото приложение. Widget-овете могат да бъдат stateful (с променливо състояние) и stateless (непроменливи). Dart описва декларативен UI: build() връща дърво от widget-ове, което 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),
      ),
    );
  }
}

Widget-ът HomeScreen — StatefulWidget с вътрешно състояние _counter. Извикването на setState() уведомява Flutter за необходимостта от преизграждане на UI — Dart кодът рестартира build(), създавайки ново дърво от widget-ове. Flutter ефективно сравнява (diff) старото и новото дърво, актуализирайки само променените части на екрана. Hot Reload заменя build() без нулиране на състоянието _counter.

Компилация на Dart: JIT vs AOT

Компилацията на Dart — хибридна: JIT за разработка и AOT за продукция. В debug режим Dart VM стартира JIT компилатор, който интерпретира байт-код с възможност за гореща смяна на кода. В release dart compile exe или flutter build създава естествен AOT двоичен файл за конкретна архитектура (arm64, x86_64, armv7).

РежимКомпилацияСкорост на изпълнениеРазмер на двоичния файлHot Reload
DebugJIT (VM)Средна~50 MBДа
ReleaseAOT (Native)Максимална~15-20 MBНе
Webdart2jsЗависи от браузъраПроменливDev сървър

JIT компилацията на Dart в debug режим осигурява горещо презареждане за ~1 секунда — разработчикът вижда промените в UI без загуба на състоянието на приложението. AOT компилацията дава производителност, близка до естествените Swift/Kotlin приложения. Според данни на Google, 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 — статичен анализатор, проверяващ типове, неизползвани импорти и потенциални грешки. dart format — форматиращ инструмент, автоматично привеждащ кода към единен стил. dart doc — генератор на документация от /// коментари. Flutter DevTools — профилиращ инструмент с преглед на дървото от widget-ове, логове, памет и мрежа. 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 — език за програмиране от Google (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 се компилира AOT до естествен ARM код чрез Dart Native. В debug режим Dart VM използва JIT с горещо презареждане. Flutter Engine (C++) рендерира UI чрез Skia/Impeller. За Android — flutter build apk, за iOS — flutter build ios. Уеб компилацията използва dart2js или dart2wasm. Размер на release APK — 15-20 MB (без разделяне 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 и библиотека с widget-ове. IDE — Android Studio или VS Code с Flutter добавка. DevTools — профилиращ инструмент с инспектор на widget-ове. Pub.dev — мениджър на пакети с 45 000+ библиотеки. Анализаторът dart analyze и форматиращият инструмент dart format — за качество на кода. Build_runner — за генериране на JSON модели.

Резюме

  • Dart — езикът на Google за Flutter, съчетаващ JIT разработка и AOT производителност
  • Sound null safety от Dart 2.12 (+3.0) — задължителна защита от null на ниво типове
  • Асинхронност чрез Future (единичен резултат), Stream (последователност), Isolate (паралелизъм)
  • Flutter — декларативна UI рамка, където всичко е widget (StatelessWidget / StatefulWidget)
  • Hot Reload — JIT презареждане за ~1 секунда без загуба на състоянието на приложението
  • Pub.dev — екосистема от пакети (45 000+), управлявана чрез pubspec.yaml
  • Flutter DevTools — профилиращ инструмент с инспектор на widget-ове, памет и мрежа

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също