Dart — мова програмування від Google, створена спеціально для кросплатформеного фреймворку Flutter. Вона поєднує JIT-компіляцію для блискавично гарячого перезавантаження та AOT-компіляцію для нативної продуктивності в релізних збірках. Dart використовується не тільки в мобільній розробці, але й для веб-додатків (AngularDart) та серверних рішень. Докладніше про можливості мови читайте в офіційній документації 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 включає три основні напрями: 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), багаторазове через mixins (mixin). Dart не підтримує інтерфейси як окрему концепцію — будь-який клас може бути імплементований (implements). Mixin — це клас без конструктора, чиї методи та поля можуть бути додані до будь-якого класу через ключове слово 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 може бути в стані очікування, завершений зі значенням або завершений з помилкою. Ланцюжок .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 (Нативний) | Максимальна | ~15-20 МБ | Ні |
| Web | dart2js | Залежить від браузера | Змінний | Dev-сервер |
JIT-компіляція Dart у режимі налагодження забезпечує гаряче перезавантаження за ~1 секунду — розробник бачить зміни UI без втрати стану додатка. AOT-компіляція забезпечує продуктивність, близьку до нативних Swift/Kotlin додатків. За даними Google, 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 — статичний аналізатор, що перевіряє типи, невикористані імпорти та потенційні помилки. 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 — мова програмування від Google (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 компілюється 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 підтримує примітиви: 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 створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.