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 — параллелизм через изолированные потоки без shared memory
  • 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-компилятор injects изменённый код в работающее приложение за миллисекунды, не требуя перекомпиляции APK — это ключевое преимущество Dart перед другими языками в контексте мобильной разработки.

Ключевая особенность Dart — sound null safety, введённая в Dart 2.12 (2021). Система типов гарантирует, что переменная не может быть null без явного указания (int?). Это исключает NullPointerException на этапе компиляции. По данным Google, внедрение null safety сократило количество крашей в Flutter-приложениях на 30% в production-окружении.

Экосистема 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...
}

// 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 реализована через 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 для читаемости.

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 или named routes.

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 (Native)Максимальная~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 (отдельные потоки без shared memory), 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. Web-сборка использует 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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