Dart 3.3 вышел! В нем появилась функция Extension Types, новые модели взаимодействия с JavaScript и библиотеками для браузера. А еще Google выпустила бета-версию Google AI Dart SDK. Юра Петров, Flutter Team Lead в Friflex, делится первым переводом официального релиза Dart от Google.
Типы расширений
Extension Types или типы расширений — это обертки для типов с нулевой стоимостью. С их помощью можно оптимизировать код, чувствительный к производительности, особенно при работе с хост-платформами. Типы расширений помогают расширить функциональность существующих типов: добавлять новые методы и поля без создания отдельного экземпляра класса.
extension type Wrapper(int i) {
void showValue() {
print('my value is $i');
}
}
void main() {
final wrapper = Wrapper(42);
wrapper.showValue(); // Prints 'my value is 42'
}
Пример выше определяет Wrapper как тип расширения, но использует его как обычный тип Dart. Вы можете создавать его экземпляры и вызывать функции. Ключевое отличие заключается в том, что Dart компилирует Wrapper как обычное целое число (int). Типы расширений позволяют легко создавать тип с уникальными членами без косвенных затрат на выделение памяти для типа-обертки.
Начиная с Dart 2.7 элементы расширения (extension members) позволяли добавлять функции и свойства к существующим типам. Типы расширения или extension types могут делать то же самое, а еще позволяет скрывать базовую структуру данных за новым API.
Это значит, что при взаимодействии с хост-платформами вы сможете использовать нативные типы напрямую, не создавая обертки и сохраняя чистый и производительный Dart API. Почитать подробнее про extension types можно в документации на сайте Dart.
Новая модель взаимодействия с JavaScript
Dart 3.3 представляет новую модель взаимодействия с библиотеками JavaScript и веб-платформами. API для работы с JavaScript — библиотеки dart: js_interop — дают доступ к типизированному API. Оно четко определяет границу между двумя языками с помощью статической проверки. Это устраняет целый класс проблем еще до компиляции. Кроме новых API для доступа к коду JavaScript в Dart 3.3 есть модель представления типов JavaScript в Dart с использованием типов расширений.
import 'dart:js_interop';
/// Represents the `console` browser API.
extension type MyConsole(JSObject _) implements JSObject {
external void log(JSAny? value);
external void debug(JSAny? value);
external void info(JSAny? value);
external void warn(JSAny? value);
}
Синтаксис на основе на типов расширений дает большую выразительность и надежность, чем элементы расширения (extention members). Использовать JavaScript API из Dart становится проще. Больше деталей — в документации по взаимодействию с JS на сайте Dart.
Улучшение библиотек для браузера
Начиная с версии 1.0, Dart SDK включает полный набор библиотек для браузера. Среди них — основная библиотека dart: html, а также библиотеки для SVG, WebGL и другие.
Улучшенная модель взаимодействия с JavaScript позволила переосмыслить эти библиотеки. В будущем поддержка библиотек для браузера сосредоточится на пакете: web. Такой подход упрощает управление версиями, ускоряет обновления и соответствует ресурсам MDN. Эта цепочка улучшений ведет к следующему важному этапу: компиляции Dart в WebAssembly
WebAssembly
Dart 3.3 позволяет авторам пакетов и приложений заложить основу для WebAssembly в веб-приложениях. Хотя поддержка WebAssembly во Flutter Web остается экспериментальной, команда активно ее дорабатывает.
Чтобы запустить Flutter-приложения в веб-браузере с помощью WebAssembly, нужно перенести весь код — из приложения и всех зависимостей — на новый механизм JavaScript Interop и пакет package: web. Старые библиотеки JavaScript и браузера по-прежнему поддерживаются при компиляции в JavaScript-код.
Google AI Dart SDK
Google выпустила бета-версию Google AI Dart SDK. Теперь можно добавлять в приложения на Dart и Flutter функции на основе семейства моделей генеративного искусственного интеллекта Gemini. Оставляем ссылки на пакет google_generative_ai и краткое руководство по работе с API Gemini в приложения на Dart и Flutter от Google.
P.S. Мы ведем дружелюбный канал про Flutter в Telegram. Присоединяйтесь!