Перейти к основному содержимому

Dart

Разработчику Архитектору Инженеру

Dart

Этот материал лучше воспринимать как связку "язык + платформа": Dart отвечает за типобезопасную и быструю разработку, Flutter — за единый UI-слой на разных платформах. Практический маршрут после чтения: галерея готовых виджетов → первый запуск flutter run → сборка и публикация по Публикация Android-приложения.


Где применяют Flutter

Flutter — это кроссплатформенный фреймворк с открытым исходным кодом, разработанный компанией Google для создания нативных интерфейсов мобильных приложений, веб-страниц и настольных приложений из единой кодовой базы. Технология использует язык программирования Dart и компилирует код в нативный машинный код для целевых платформ (Android, iOS, Windows, macOS, Linux).

Фреймворк не использует стандартные компоненты операционной системы для отрисовки интерфейса. Вместо этого он предоставляет собственный движок рендеринга Skia (в новых версиях также Impeller), который рисует каждый пиксель на экране устройства напрямую. Это обеспечивает идентичное отображение приложения на всех платформах и высокую производительность без задержек, характерных для мостов между языками.

Разработка на Flutter объединяет логику приложения и его визуальную часть в единую структуру. Разработчик описывает интерфейс как дерево виджетов, где каждый элемент является объектом класса. Изменение состояния данных автоматически вызывает перерисовку соответствующих частей интерфейса. Такой подход упрощает поддержку кода и ускоряет процесс разработки.


Язык Dart

Dart — это оптимизированный для клиентских приложений язык программирования, созданный Google специально для использования с Flutter. Он поддерживает строгую типизацию, сборку мусора и имеет синтаксис, похожий на Java или C#.

Язык обладает несколькими ключевыми особенностями:

  • Асинхронность: встроенная поддержка async и await для работы с сетью и базой данных без блокировки основного потока;
  • Гарантии безопасности типов: компилятор проверяет типы данных на этапе сборки, что снижает количество ошибок во время выполнения;
  • Hot Reload: возможность мгновенного обновления изменений в коде на запущенном приложении без потери текущего состояния;
  • Компиляция: код можно компилировать в байт-код для виртуальной машины Dart или в нативный машинный код ARM/x86 через Ahead-of-Time (AOT) компиляцию.

В экосистеме Flutter Dart выступает единственным языком написания логики и интерфейса. Библиотека стандартной библиотеки языка включает классы для работы со строками, коллекциями, датами, сетевыми запросами и криптографией.

void main() {
print('Hello, Flutter!');
}

Пример объявления функции с асинхронностью:

Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return 'Данные получены';
}

Архитектура приложения

Архитектура приложения на Flutter строится вокруг концепции виджетов. Виджет представляет собой любой элемент интерфейса: от кнопки до целого экрана. Все элементы являются подклассами базового класса Widget.

Дерево виджетов состоит из трех основных типов узлов:

  1. Element — узел управления состоянием и жизненным циклом;
  2. RenderObject — узел, отвечающий за отрисовку и размер элемента;
  3. Widget — неизменяемое описание того, как должен выглядеть элемент.

При изменении состояния виджета Flutter создает новый объект виджета, сравнивает его с предыдущим и обновляет только те части дерева, которые изменились. Этот процесс называется Reconciliation.

Структура проекта обычно разделяется на следующие слои:

  • UI Layer: содержит все виджеты, экраны и компоненты интерфейса;
  • Business Logic Layer: реализация бизнес-правил, работа с API и базами данных;
  • Data Layer: управление данными, модели и репозитории.

Для управления сложным состоянием часто используют паттерны Provider, Bloc или Riverpod. Эти инструменты позволяют разделять логику и представление, делая код более тестируемым и поддерживаемым.


Инструменты сборки и Gradle

Процесс сборки мобильного приложения на Flutter требует взаимодействия с нативными инструментами целевой платформы. Для Android используется система сборки Gradle.

Gradle — это инструмент автоматизации сборки, который управляет зависимостями, компиляцией кода и упаковкой приложения в формат APK или AAB. Файл конфигурации build.gradle определяет версии библиотек, настройки компилятора и параметры упаковки.

Основные задачи Gradle в проекте Flutter:

  • Компиляция нативного кода Kotlin/Java;
  • Управление зависимостями через Maven Repository;
  • Генерация ресурсов (картинки, шрифты, строки);
  • Подписание приложения цифровым сертификатом;
  • Создание финального пакета для установки.

Настройка Gradle происходит автоматически при создании проекта, но разработчик может изменять параметры для оптимизации размера приложения или включения специфических функций.

Пример фрагмента файла build.gradle (app level):

Код ITЗагрузка примера кода…

Сборка релиза (Gradle / Xcode под капотом):

flutter build apk
flutter build ios

Создание первого приложения

Для начала работы с Flutter необходимо установить программное окружение и создать проект. Процесс включает установку SDK, настройку эмуляторов и запуск команды генерации.


Шаг 1 — Установка Flutter SDK

Скачайте последнюю версию Flutter SDK с официального сайта. Распакуйте архив в удобную директорию и добавьте путь к папке bin в системную переменную среды PATH.

export PATH="$PATH:`pwd`/flutter/bin"

Проверьте корректность установки командой:

flutter doctor

Инструмент покажет статус установленных компонентов и предложит исправить возможные ошибки.


Шаг 2 — Настройка среды разработки

Установите редактор кода VS Code или Android Studio. В VS Code установите расширения "Flutter" и "Dart". В Android Studio создайте новый проект, выбрав шаблон "Flutter App".


Шаг 3 — Создание проекта

Откройте терминал в директории для проектов:

flutter create my_first_app

После завершения создания перейдите в папку проекта:

cd my_first_app

Шаг 4 — Запуск приложения

Подключите устройство Android или эмулятор, затем:

flutter run

Приложение откроется на устройстве. При внесении изменений в файл lib/main.dart используйте функцию Hot Reload для мгновенного просмотра результатов.

Пример минимального кода приложения:

Код ITЗагрузка примера кода…


Шаг 5 — Сборка релизной версии

Релизная сборка APK:

flutter build apk --release

Файл приложения будет создан в папке build/app/outputs/flutter-apk/.


Особенности разработки

Разработка на Flutter имеет ряд уникальных характеристик, отличающих её от нативной разработки.

Единая кодовая база позволяет писать один раз и запускать на всех платформах. Это сокращает время разработки и стоимость поддержки. Однако иногда требуется использовать нативные плагины для доступа к специфическим функциям устройства.

Производительность приложения близка к нативной благодаря прямой компиляции в машинный код. Движок рендеринга обходит ограничения браузерных WebView, обеспечивая плавную анимацию и быстрый отклик.

Кастомизация интерфейса не ограничена стандартами Material Design или Cupertino. Разработчик может создавать уникальные дизайн-системы, полностью контролируя внешний вид каждого элемента.

Тестирование встроено в экосистему. Существуют инструменты для юнит-тестирования, тестирования виджетов и интеграционного тестирования. Автоматизация процессов CI/CD упрощена благодаря поддержке популярных инструментов.


Когда выбирать Flutter

Flutter особенно эффективен в проектах с ограниченным сроком вывода на рынок и требованием единого интерфейса на Android и iOS. Если команда уже умеет работать с JavaScript, C# или Kotlin, переход на Dart обычно занимает несколько недель при ежедневной практике.

Практические сценарии, где Flutter дает сильный результат:

  • стартап-продукт с быстрыми UI-итерациями;
  • клиентское приложение для внутренней корпоративной системы;
  • маркетплейс или сервис с большим количеством однотипных экранов;
  • приложение с кастомной визуальной стилистикой и сложной анимацией.

Сценарии, где стоит отдельно оценить альтернативы:

  • глубокая интеграция с платформенными API iOS или Android на старте;
  • проект с тяжелой 3D-графикой и игровым рендерингом;
  • команда, которая полностью специализируется на нативных стеках и не планирует общий код.

Для сравнения подходов используйте соседние статьи: React Native, Kotlin в мобильных приложениях, Swift в мобильных приложениях, PWA.


Архитектурный каркас production-приложения

Шаблон "один файл main.dart на все" быстро упирается в сложность. Рабочий контур production-проекта обычно включает:

  1. features/ по бизнес-доменам (auth, catalog, profile);
  2. core/ для общих сервисов, логирования, ошибок, навигации;
  3. data/ для API-клиента, DTO, репозиториев;
  4. domain/ для use-case и контрактов;
  5. presentation/ для экранов, виджетов и состояния.

Пример структуры:

lib/
core/
error/
network/
routing/
features/
auth/
data/
domain/
presentation/
catalog/
data/
domain/
presentation/

Такой подход снижает связанность модулей и упрощает командную разработку.


Антипаттерны и как их избежать

Типовые проблемы в реальных проектах:

  • Логика HTTP прямо в Widget
    Выносите сетевые вызовы в репозитории и use-case.
  • Глобальные singleton без контроля жизненного цикла
    Используйте DI-контейнер и явную инициализацию зависимостей.
  • Большие виджеты на 500+ строк
    Дробите экран на композицию маленьких переиспользуемых компонентов.
  • Хаотичное управление состоянием
    Выберите один подход (например, Riverpod или Bloc) и закрепите его в стандартах команды.
  • Отсутствие стратегии обработки ошибок
    Введите единый формат ошибок и экранов состояния loading, empty, error.

Чеклист перед релизом

  • flutter analyze без критических предупреждений;
  • flutter test проходит стабильно;
  • проверена работа на медленном устройстве и слабой сети;
  • проверены разрешения и тексты в манифестах платформ;
  • увеличены versionCode и versionName;
  • собран и подписан релиз по инструкции из Публикация Android-приложения;
  • добавлена базовая продуктовая аналитика и crash-репортинг.

Первая программа на Dart: /encyclopedia/5-languages/5-22-dart/7. Публикация Android: Публикация Android-приложения.


Частые ошибки

СимптомПричина
flutter not foundSDK не в PATH — flutter doctor
Красный экранОшибка в build() — смотрите консоль
setState() called after disposeОбновление state после закрытия экрана
Размер APK огромныйНе split per ABI — flutter build apk --split-per-abi

Что попробовать

  1. flutter create counter && flutter run — счётчик из документации.
  2. flutter pub add http — запрос к публичному API.
  3. Material 3: theme: ThemeData(useMaterial3: true).