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-компилятор injects изменённый код в работающее приложение за миллисекунды, не требуя перекомпиляции APK — это ключевое преимущество Dart перед другими языками в контексте мобильной разработки.
Ключевая особенность Dart — sound null safety, введённая в Dart 2.12 (2021). Система типов гарантирует, что переменная не может быть null без явного указания (int?). Это исключает NullPointerException на этапе компиляции. По данным Google, внедрение null safety сократило количество крашей в Flutter-приложениях на 30% в production-окружении.
Экосистема 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...
}
// Named constructor
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}Класс Duck наследует Animal и использует два миксина — Swimmer и Flyer. Это демонстрирует множественное наследование без проблем ромбовидной структуры: миксины линейно разрешаются (super chain). Named конструкторы (Config.development) — альтернатива статическим фабричным методам для создания объектов с предустановленными параметрами.
Асинхронность в Dart реализована через Future (одиночное значение), Stream (последовательность значений) и async/await. Dart использует однопоточную модель с event loop, аналогичную JavaScript, но с важным отличием: длительные вычисления не блокируют UI, так как Dart-код выполняется в Isolate — отдельном потоке без shared memory.
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 или named routes.
// Простое 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 | Зависит от браузера | Переменный | 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 (отдельные потоки без shared memory), 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. Web-сборка использует 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 года. Мы проконсультируем вас и предложим наилучшее решение.