(!) Дата релиза этого обновления: 13 августа 2025. Это плановый, «прикладной» апдейт, который делает анализатор умнее, CLI — ощутимо быстрее, pub — точнее в разрешении зависимостей, а также приносит официальный MCP-сервер для интеграции Dart/Flutter с ИИ-ассистентами. Ниже — только существенное, с примерами и пошаговыми рекомендациями. (Dart)

Основное

1) Анализатор «понимает» null-safety глубже

В Dart 3.9 механики type promotion / reachability / definite assignment работают с учётом null-safety по умолчанию. Итог: больше точных предупреждений об «мёртвом коде» и лишних проверках на null. Чтобы задействовать улучшения, установите нижнюю границу SDK ^3.9.0. (Dart)

# pubspec.yaml
environment:
  sdk: ^3.9.0

Мини-пример пользы (анализатор отловит недостижимую ветку):

int? n;
if (n == null) return;
// Ниже n гарантированно non-null, лишний if будет подсвечен:
if (n != null) print(n.isEven); // dead_code / избыточная проверка
print(n.isEven);

2) CLI заметно быстрее

dart analyze, dart fix и другие команды теперь запускают AOT-снимок analysis server вместо JIT-подготовки перед каждым вызовом. На реальных пакетах команда dart analyze ускоряется примерно до ~1.5×; короткие команды — ещё заметнее. (Dart)

3) MCP-сервер для Dart/Flutter (интеграция с ИИ-ассистентами)

Появился Dart and Flutter MCP Server — мост между проектом и совместимыми ассистентами (Gemini CLI, GitHub Copilot, Cursor и др.). Ассистент получает безопасный доступ к контексту проекта и стандартным действиям: исправление ошибок, управление зависимостями, форматирование, запуск тестов и прочее. Статус — experimental, требуется Dart 3.9+. (Dart)

Мини-старт:

# Пример для совместимого клиента: команда MCP-сервера — `dart mcp-server`
dart mcp-server

4) Pub стал точнее и дисциплинированнее

  • Git-зависимости теперь можно «решать» по git-тегам через tag_pattern — полезно, если релизы маркируются тегами vX.Y.Z. (Dart)

  • В корневом пакете с Dart 3.9 учитывается верхняя граница flutter: можно закрепить команду на конкретной версии Flutter, и pub get упадёт при несоответствии SDK. (Dart)

# pubspec.yaml — пример git + tag_pattern и жёсткая привязка Flutter
environment:
  sdk: ^3.9.0
  flutter: 3.35.0

dependencies:
  my_dependency:
    git:
      url: https://github.com/example/my\_dependency
      tag_pattern: v{{version}}
    version: ^2.0.1

5) Компилятор: кросс-компиляция и архитектуры

Добавлена кросс-компиляция на Linux для arm (ARM32) и riscv64, улучшена документация по dart compile; при этом x86 32-бит объявлена устаревшей (deprecated) — затрагивает главным образом старые эмуляторы. (Dart)

Детали и нюансы

Улучшения soundness в dartdevc

Исправлена уязвимость, при которой значение, возвращаемое геттером с типовым параметром, «заводилось» как вызываемое без нужных рантайм-проверок — редкий, но принципиальный случай. (Dart)

Новые линты по умолчанию (рекомендуемые к включению)

  • switch_on_typeне переключаться по Type, вместо этого использовать сопоставление с образцом (patterns). (Dart)

  • unnecessary_unawaitedне оборачивать в unawaited() то, что помечено аннотацией @awaitNotRequired. (Dart)

# analysis_options.yaml
linter:
  rules:
    - switch_on_type
    - unnecessary_unawaited

Короткий пример для switch_on_type:

// Плохо:
switch (o.runtimeType) { case int: ... }

// Хорошо:
switch (o) {
  case int(): ...
  case String _: ...
  default: ...
}

Практическая ценность для команд

  1. Меньше скрытых дефектов
    Null-safety-aware анализ ловит «мёртвые» ветки и лишние проверки уже на этапе analyze, что упрощает ревью и снижает риск регрессий. (Dart)

  2. Быстрее циклы разработки
    AOT-снимок analysis server уменьшает «трение» при частых локальных проверках (analyze, fix). Это особенно чувствуется в монорепозиториях и больших Flutter-проектах. (Dart)

  3. Более предсказуемые зависимости
    tag_pattern в git-зависимостях исключает случайные коммиты вне релизных тегов; верхняя граница flutter в корне синхронизирует рабочих разработчиков на одинаковом SDK. (Dart)

  4. Интеграция с ИИ-инструментами
    MCP-сервер даёт ассистентам «легальную» видимость проекта и операции вроде «исправь runtime-ошибку», «подбери пакет под задачу», «обнови зависимости». Для сложных кодовых баз это уже экономит часы. (Dart)

  5. Покрытие новых платформ
    Поддержка кросс-компиляции на Linux-arm/riscv64 пригодится для edge/встраиваемых сценариев и серверов на RISC-V. При этом 32-битный x86 считается устаревшим — планируйте обновление эмуляторов. (Dart)

Что сделать прямо сейчас (чек-лист)

  1. Обновить SDK-границы
    В pubspec.yaml: sdk: ^3.9.0 (и при необходимости flutter: <Ваша_версия>). Затем dart pub upgrade. (Dart)

  2. Включить полезные линты
    Добавьте switch_on_type и unnecessary_unawaited в analysis_options.yaml. Прогоните dart analyze + dart fix --apply. (Dart)

  3. Ускорить рутину
    Перейдите на новые CLI-бинарии (они входят в SDK 3.9). Оцените выигрыш на Вашем репозитории (time dart analyze). (Dart)

  4. Навести порядок в git-зависимостях
    Если релизы размечаются тегами, добавьте tag_pattern в соответствующие записи зависимостей. (dart.googlesource.com)

  5. Попробовать MCP-сервер
    Если используете ассистента (Gemini CLI / Copilot / Cursor), пропишите запуск dart mcp-server в настройках клиента и протестируйте сценарии «исправь layout-ошибку», «добавь пакет и обнови код». (Dart)

Короткие ответы на типичные вопросы

  • Ломает ли обновление существующий код?
    Как правило — нет. Возможны новые предупреждения (dead_code, линты), которые стоит поправить. (Dart)

  • Нужно ли мигрировать все пакеты?
    Достаточно поднять environment.sdk до ^3.9.0 в целевых пакетах; сторонние зависимости продолжают работать, но рекомендуйте авторам протестировать на 3.9 для новой диагностики. (Dart)

  • Как понять, поддерживается ли мой целевой рантайм?
    Для Linux теперь проще собирать под arm/riscv64 с хоста x64; x86-32 считается устаревшим. Актуальные команды — на странице dart compile. (Dart)

Вывод

Dart 3.9 — это реальная экономия времени и снижение «шума» в кодовой базе: быстрейшие проверки, умнее null-анализ, дисциплина в зависимостях, плюс официальный канал для «осмысленных» действий ИИ-ассистента в Вашем проекте. Если Вы регулярно запускаете dart analyze/fix, держите git-зависимости или смотрите в сторону RISC-V/ARM Linux — обновляться стоит сразу. (Dart)

Источники

Официальный анонс Dart 3.9 (язык, CLI, MCP, pub, архитектуры) (Dart)
«What’s new»: точная дата релиза, обновления документации (ARM/RISC-V, MCP) (Dart)
SDK Changelog 3.9.0: детали линтов, git-теги в pub, soundness-фикс в DDC (dart.googlesource.com)
Линты switch_on_type и unnecessary_unawaited (описание и примеры) (Dart)
Страница dart compile (актуальные сведения по компиляции) (Dart)

Комментарии (2)


  1. AuToMaton
    25.10.2025 06:02

    Что ещё плохого кроме жидкого стекла случилось с Flutter что нужно пиарить его через протухшее обновление?

    Типа совет

    Если статья об обновлении Dart версии n.m не вышла за три (3) дня после обновления, ждите обновления до версии n.(m+1).


    1. lil_master Автор
      25.10.2025 06:02

      Я заметил, что на хабре не было публикаций фич, которые были внесены в дарт 3.9, а тем более с разбором примеров.
      В начале статьи указано к какой дате относится обновление, чтобы читатель мог понять своевременность обновления.
      Дарт - не флаттер, фичи языка и фреймворка - не одно и тоже.
      Flutter - отличный фреймворк, если не шарите - оставьте ваше мнение и советы при себе, да поглубже, и залейте жидким стеклом, чтобы иногда не вываливались.