Этот релиз приносит обновления форматера, null-aware элементы для коллекций, новые возможности кросс-платформенной разработки, лучший способ находить трендовые пакеты на pub.dev, доступность горячей перезагрузки (hot reload) для веба и многое другое! Мы также надеемся, что найдутся разработчики, заинтересованные в участии в нашей программе раннего доступа к FFigen и JNIgen.
Обновления форматера
В предыдущем релизе Dart включал в себя в значительной степени переписанный форматер, который поддерживал новый «высокий» (tall) стиль. Релиз Dart 3.8 включает дополнительную обратную связь, исправления ошибок и другие улучшения.
Обратите внимание, что если вы обновитесь до Dart 3.8 SDK, ваше форматирование не изменится, пока вы не измените pubspec
вашего пакета, чтобы выбрать последнюю версию языка.
Висячие запятые и более "высокий" код
В предыдущих релизах висячая запятая принудительно разделяла окружающую конструкцию на несколько строк. Новый форматер теперь сам решает, следует ли разделять конструкцию, а затем добавляет или удаляет висячую запятую по мере необходимости.
// Форматер до изменений
TabBar(tabs: [Tab(text: 'A'), Tab(text: 'B')], labelColor: Colors.white70);
// Форматер после изменений
TabBar(
tabs: [
Tab(text: 'A'),
Tab(text: 'B'),
],
labelColor: Colors.white70,
);
Если вы предпочитаете старое поведение, вы можете снова включить его с помощью флага конфигурации.
Изменения стиля
Был внесен ряд изменений в стиль, которые делают вывод более компактным и улучшенным. Вот несколько примеров:
// Ранее выпущенный форматер (функции)
function(
name:
(param) => another(
argument1,
argument2,
),
);
// Форматер Dart 3.8 (функции)
function(
name: (param) => another(
argument1,
argument2,
),
);
// Ранее выпущенный форматер (переменные)
variable =
target.property
.method()
.another();
// Форматер Dart 3.8 (переменные)
variable = target.property
.method()
.another();
Кросс-компиляция
Появилась новая поддержка компиляции в нативные бинарные файлы Linux с машин разработки Windows, macOS и Linux. Вы можете сделать это с помощью команд dart compile exe
или dart compile aot-snapshot
и флагов --target-os
и --target-arch
.
// Пример кросс-компиляции для exe
$ dart compile exe --target-os=linux --target-arch=arm64
// Пример кросс-компиляции для aot-snapshot
$ dart compile aot-snapshot --target-os=linux --target-arch=arm64
Примеры использования:
Более быстрая компиляция для встраиваемых устройств (например, Raspberry Pi) на быстром ноутбуке разработчика, в отличие от менее мощного встраиваемого устройства.
Более быстрая компиляция для бэкенда на базе Linux на машине разработчика не на Linux.
Null-aware элементы
Новые null-aware элементы позволяют добавлять элементы в коллекцию (например, список, множество или карту), только если эти элементы не равны null
. Чтобы сделать элемент null-aware в литерале коллекции, добавьте перед ним префикс ?
.
Список без null-aware элементов, который удаляет значения null
:
// Код без null-aware элементов
var listWithoutNullAwareElements = [
if (promotableNullableValue != null)
promotableNullableValue,
if (nullable.value != null)
nullable.value!,
if (nullable.value case var value?)
value,
];
Список с null-aware элементами, который удаляет значения null
:
// Код с null-aware элементами
var listWithNullAwareElements = [
?promotableNullableValue,
?nullable.value,
?nullable.value,
];
Doc imports
Теперь поддерживаются "doc imports" — новый синтаксис на основе комментариев, который позволяет ссылаться на внешние элементы в комментариях к документации, фактически не импортируя их. Этот тег можно указать в комментарии к документации над директивой library
.
В следующем примере [Future]
и [Future.value]
импортируются из библиотеки dart:async
, но только для комментариев к документации:
/// @docImport 'dart:async';
library;
/// Комментарии к документации теперь могут ссылаться на такие элементы, как
/// [Future] и [Future.value] из `dart:async`,
/// даже если библиотека не импортирована с помощью
/// фактического импорта.
class Foo {}
Doc imports поддерживают те же стили URI, что и обычные импорты Dart, включая схему dart:
, схему package:
и относительные пути. Однако их нельзя откладывать (deferred) или настраивать с помощью as
, show
, hide
.
Трендовые пакеты на pub.dev
На главной странице pub.dev раздел «Самые популярные пакеты» заменен разделом «Трендовые пакеты». Этот новый раздел демонстрирует пакеты, которые недавно показали заметный рост внедрения и интереса со стороны сообщества.

(Изображение: Раздел трендовых пакетов на pub.dev)
Горячая перезагрузка для веба (Экспериментально)
Горячая перезагрузка с сохранением состояния (Stateful hot reload) теперь доступна для веба при использовании Dart Development Compiler (DDC). Переработанное JS-представление кода Dart позволяет заменять код в работающем приложении.
Работа над этой функцией все еще продолжается, но Dart 3.8 предоставляет первую возможность попробовать ее, начиная с приложений Flutter. См. пост в блоге Flutter для инструкций о том, как включить горячую перезагрузку.

(Изображение: Горячая перезагрузка Dart для веба с сохранением состояния)
Это была многолетняя работа, включавшая изменение представления типов времени выполнения, перепроектирование иерархий классов и обновление способа загрузки кода на страницу. Цель — достичь полного паритета с существующей реализацией горячей перезагрузки в VM (виртуальной машине). В почти всех случаях эта функция уже должна быть неотличима от того, к чему вы привыкли в VM. Все известные проблемы вы можете найти в трекере проблем.
Основное внимание уделяется тому, чтобы сделать эту функцию доступной сначала в приложениях Flutter, но в планах — интегрировать горячую перезагрузку в build_web_compilers
для использования в веб-приложениях, не относящихся к Flutter, позже.
Прямое нативное взаимодействие (Interoperability)
Мы рады запустить программу раннего доступа для FFigen и JNIgen — решений для генерации кода, предназначенных для упрощения интеграции с API нативных платформ. Мы ищем авторов плагинов Flutter, которые хотят разрабатывать или рефакторить плагины с помощью этих решений.
Чтобы узнать больше, прочтите пост в блоге под названием Путь Flutter к бесшовному взаимодействию. В нем рассказывается о наших стремлениях к прямому нативному взаимодействию, дорожной карте для их достижения и программе раннего доступа.
Заключение
Dart 3.8 — это свидетельство нашего постоянного стремления совершенствовать опыт разработки. Мы призываем вас изучить эти новые функции — от интеллектуального форматера и поддержки кросс-компиляции до null-aware элементов, горячей перезагрузки для веба и раннего доступа к нативному взаимодействию. Ваши идеи и вклад жизненно важны для постоянного роста Dart и Flutter, и мы с нетерпением ждем, какие приложения вы создадите.