Dart: що це таке, особливості мови Flutter та програмування

Автор: IT Sectr Опубліковано: 2026-02-10 Час читання: 12 хв

Dart — мова програмування від Google, створена спеціально для кросплатформеного фреймворку Flutter. Вона поєднує JIT-компіляцію для блискавично гарячого перезавантаження та AOT-компіляцію для нативної продуктивності в релізних збірках. Dart використовується не тільки в мобільній розробці, але й для веб-додатків (AngularDart) та серверних рішень. Докладніше про можливості мови читайте в офіційній документації Dart.

Головне

  • Dart — мова Flutter, створена Google, з 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-подібним синтаксисом, розроблена Google під керівництвом Ларса Бака (творця Eclipse). Перший реліз відбувся у 2011 році, але справжню популярність Dart здобув у 2018 році з виходом Flutter 1.0. Мова спроектована для створення інтерфейсів користувача: вона має вбудовану підтримку стрімів, future та реактивних патернів.

Філософія Dart — «баланс продуктивності та продуктивності». Мова підтримує дві стратегії компіляції: JIT (Just-In-Time) для розробки з гарячим перезавантаженням та AOT (Ahead-Of-Time) для релізних збірок з нативною продуктивністю. 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), багаторазове через mixins (mixin). Dart не підтримує інтерфейси як окрему концепцію — будь-який клас може бути імплементований (implements). Mixin — це клас без конструктора, чиї методи та поля можуть бути додані до будь-якого класу через ключове слово 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 може бути в стані очікування, завершений зі значенням або завершений з помилкою. Ланцюжок .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 vs AOT

Компіляція Dart — гібридна: JIT для розробки та AOT для продакшну. У режимі налагодження Dart VM запускає JIT-компілятор, який інтерпретує байт-код з можливістю гарячої заміни коду. У релізі dart compile exe або flutter build створює нативний AOT-бінарник під конкретну архітектуру (arm64, x86_64, armv7).

РежимКомпіляціяШвидкість виконанняРозмір бінарникаHot Reload
DebugJIT (VM)Середня~50 МБТак
ReleaseAOT (Нативний)Максимальна~15-20 МБНі
Webdart2jsЗалежить від браузераЗміннийDev-сервер

JIT-компіляція Dart у режимі налагодження забезпечує гаряче перезавантаження за ~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 — профілювач з переглядом дерева віджетів, логів, пам'яті та мережі. 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. У режимі налагодження Dart VM використовує JIT з гарячим перезавантаженням. Flutter Engine (C++) рендерить UI через Skia/Impeller. Для Android — 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 — мова Google для 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 створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також