Pull to refresh

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

Level of difficultyMedium
Reading time7 min
Views4.3K

Статья представляет из себя композицию нескольких авторских переводов статей от лица команды разработчиков Dart/Flutter, ссылки на оригинальные материалы будут даны в конце статьи.

Dart 3.3: Революционное обновление для производительности и кросс-платформенной разработки

Dart 3.3 вышел в свет, и это настоящая революция для производительности и кросс-платформенной разработки! Приготовьтесь улучшить свои приложения с помощью расширяемых типов (extension types), которые переосмысляют оптимизацию производительности и взаимодействие с нативным кодом. Кроме того, наша обновлённая модель взаимодействия с JavaScript обеспечивает надёжную проверку типов и удобный способ использования возможностей веб-платформы. Всё это прокладывает путь к поддержке WebAssembly. И да, вы правильно прочитали - Google AI в ваших приложениях Dart! Всё это доступно в Dart 3.3. Давайте погрузимся!

Знакомство с расширяемыми типами

Расширяемые типы представляют собой обёртки для типов с нулевой стоимостью.

Тип с нулевой стоимостью (zero-cost wrapper) в контексте программирования означает обертку типа данных, которая не влечет дополнительных затрат на производительность при ее использовании. Это достигается за счет того, что такая обертка компилируется таким образом, что она не добавляет никакой накладной стоимости к операциям с обернутым типом. В контексте Dart 3.3, расширенные типы позволяют создавать такие обертки, оптимизируя производительность чувствительного кода и взаимодействие с родными платформами без дополнительных затрат, связанных с выделением памяти для типичных оберток.

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

extension Wrapper(int i) {
  void showValue() {
    print('my value is $i');
  }
}
void main() {
final wrapper = Wrapper(42);
wrapper.showValue(); // Печатает 'my value is 42'
}

В приведенном выше примере Wrapper определён как расширяемый тип, но используется как обычный тип Dart. Вы можете создавать его экземпляры и вызывать функции. Ключевое отличие заключается в том, что Dart компилирует его как обычный int. Расширяемые типы позволяют удобно создавать тип с уникальными членами без косвенных затрат на выделение памяти для типичного типа-обёртки. Таким образом, в то время как функция extension members, доступная в Dart с версии 2.7, позволяет добавлять функции и свойства к существующему типу, функция extension type может делать то же самое, а также позволяет определить новое API, скрывающее базовое представление.

Это особенно полезно для взаимодействия с хост-платформами. Нативные типы можно использовать напрямую, не затрачивая средств на создание обёрток и связанных с ними косвенных затрат, при этом предоставляя чистое и готовое к производству API Dart. Узнайте больше в новой документации о расширяемых типах.

Развитие взаимодействия с JavaScript

Dart 3.3 представляет новую модель взаимодействия с библиотеками JavaScript и веб-платформой. Она начинается с нового набора API для взаимодействия с JavaScript: библиотеки dart:js_interop. Теперь разработчики Dart имеют доступ к типизированному API для взаимодействия с JavaScript. Этот API четко определяет границу между двумя языками со статической проверкой. Это устраняет целый класс проблем до компиляции. Помимо новых API для доступа к коду JavaScript, Dart теперь включает новую модель представления типов JavaScript в Dart с использованием расширяемых типов.

import 'dart:js_interop';
/// Представляет браузерный API console.
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);
}

Синтаксис, основанный на расширяемых типах, позволяет выразить больше и быть более надёжным, чем функции расширения членов. Это упрощает использование API JavaScript из Dart. Подробнее см. в новой документации по JS interop.

Улучшение библиотек для браузера

Начиная с версии 1.0, SDK Dart включает в себя набор комплексных библиотек для браузера. Они включают основную библиотеку dart:html, а также библиотеки для SVG, WebGL и других.

Улучшенная модель взаимодействия с JavaScript открыла возможность переосмыслить эти библиотеки. В дальнейшем наша поддержка библиотек для браузера будет сосредоточена на package:web. Это упрощает создание версий, ускоряет обновления и согласовывает их с ресурсами MDN.

Эта цепочка улучшений приводит к следующему важному шагу: компиляции Dart в WebAssembly.

Подготовка к WebAssembly с Dart 3.3

Dart 3.3 позволяет разработчикам пакетов и приложений заложить основу для веб-приложений, компилируемых в WebAssembly. Хотя поддержка WebAssembly в Flutter Web пока находится на экспериментальной стадии, команда активно работает над ее стабилизацией. Чтобы запустить приложения Flutter в веб-браузере с использованием WebAssembly, необходимо перенести весь код - как самого приложения, так и всех его зависимостей - на новый механизм JavaScript Interop и пакет package:web. При этом устаревшие библиотеки JavaScript и браузера остаются без изменений и поддерживаются для компиляции в JavaScript-код. Однако для компиляции в WebAssembly требуется миграция.

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

Дополнительная информация: Google AI Dart SDK

Google выпустила бета-версию Google AI Dart SDK. Вы можете добавить в свои приложения Dart или Flutter функции генеративного искусственного интеллекта. Эти приложения используют Gemini, новейшее семейство моделей ИИ от Google. Ознакомьтесь с пакетом package:google_generative_ai - https://pub.dev/packages/google_generative_ai .

Как начать пользоваться?

Ознакомьтесь с кратким руководством по Dart , чтобы получить подробное пошаговое руководство по настройке:

  1. Получите ключ Gemini API от Google AI Studio. Мы настоятельно рекомендуем вам не включать ключ непосредственно в свой код и не проверять файлы, содержащие ключ, в системах контроля версий. При разработке мы рекомендуем использовать flutter run -d [DEVICE NAME] — dart-define=API_KEY=[YOUR API KEY]для запуска приложения в эмуляторе/симуляторе, используя ваш ключ API в качестве переменной среды.

  2. Добавьте Google AI Dart SDK в свое приложение Dart или Flutter, запустив dart pub add google_generative_aiили flutter pub add google_generative_aiсоответственно. Это добавляет google_generative_aiзависимость к вашему файлу `pubspec.yaml`.

  3. Инициализируйте генеративную модель в своем коде:

import 'package:google_generative_ai/google_generative_ai.dart';

// Access your API key as an environment variable (see first step above)
final apiKey = Platform.environment['API_KEY'];
if (apiKey == null) {
  print('No \$API_KEY environment variable');
  exit(1);
}

final model = GenerativeModel(model: 'MODEL_NAME', apiKey: apiKey);

4. Теперь вы можете начать использовать API Gemini для реализации различных вариантов использования. Например, если входные данные приложения включают в себя как текст, так и изображения, используйте gemini-pro-visionмодель и generateContentметод для создания текстового вывода:

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see first step above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // For text-and-image input (multimodal), use the gemini-pro-vision model
  final model = GenerativeModel(model: 'gemini-pro-vision', apiKey: apiKey);
  final (firstImage, secondImage) = await (
    File('image0.jpg').readAsBytes(),
    File('image1.jpg').readAsBytes()
  ).wait;
  final prompt = TextPart("What's different between these pictures?");
  final imageParts = [
    DataPart('image/jpeg', firstImage),
    DataPart('image/jpeg', secondImage),
  ];
  final response = await model.generateContent([
    Content.multi([prompt, ...imageParts])
  ]);
  print(response.text);
}

Изучите документацию Gemini API и ознакомьтесь с примерами приложений Dart и Flutter в репозитории GitHub, где вы найдете подробные руководства и примеры использования SDK для различных вариантов использования, или с этим примером приложения на DartPad, который представляет собой бесплатную программу с открытым исходным кодом. онлайн-редактор фрагментов Dart и Flutter, теперь созданный с помощью Flutter. Сообщайте о любых проблемах или сообщайте нам о запросах функций в репозитории GitHub для генеративного-ии-дарта .

Google ИИ-студия

Помимо SDK, Google AI Studio представляет собой браузерную среду разработки для создания прототипов с помощью генеративных моделей. Это позволяет быстро разрабатывать подсказки для вашего варианта использования, а затем получать ключ API для использования при разработке вашего приложения. Вы можете войти в Google AI Studio под своей учетной записью Google и воспользоваться бесплатной квотой, которая позволяет выполнять 60 запросов в минуту. Чтобы помочь нам улучшить качество продукта, при использовании бесплатной квоты входные и выходные данные Google AI Studio могут быть доступны обученным рецензентам. Эти данные обезличены от вашей учетной записи Google и ключа API.

Скоро мы добавим Dart в Google AI Studio, так что следите за анонсами! Это позволит вам просто нажать «Получить код», выбрать новую вкладку Dart (которая будет рядом с существующими поддерживаемыми языками), а затем «Скопировать» код Dart, чтобы перенести свою работу в выбранную вами IDE.

Скриншот Google AI Studio
Google ИИ-студия

Поделитесь тем, что вы строите!

Мы с нетерпением ждем возможности увидеть, что вы создадите с помощью Gemini, как и команда LeanCode, которая использовала API Gemini для создания arb_translate . Это пакет, который помогает разработчикам автоматически выполнять языковой перевод, упрощая локализацию в приложениях Flutter.

Оригинальные материалы:

https://medium.com/dartlang/dart-3-3-325bf2bf6c13

https://medium.com/@sahaj.blup/flutter-3-19-enhanced-app-performance-and-more-4f45971b4e64

https://medium.com/flutter/harness-the-gemini-api-in-your-dart-and-flutter-apps-00573e560381

Tags:
Hubs:
Total votes 7: ↑6 and ↓1+5
Comments3

Articles