Как стать автором
Обновить

Dart 3.8 — что нового в Dart?

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров2K
Автор оригинала: Amanda Fitch

Этот релиз приносит обновления форматера, 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, и мы с нетерпением ждем, какие приложения вы создадите.

Теги:
Хабы:
+5
Комментарии14

Публикации

Работа

Ближайшие события