Что нового в Flutter 3.19

Что нового в Flutter 3.19

Интеграция с искусственным интеллектом, обновления Impeller и поддержка Windows Arm64. Юра Петров, Flutter Team Lead в Friflex, делится первым переводом официального релиза Flutter 3.19 от Google.

Интеграция с искусственным интеллектом

Вышла бета-версия Google AI Dart SDK. Она позволяет встраивать функции на основе моделей генеративного ИИ семейства Gemini в Flutter-приложение. Скачать пакет google_generative_ai можно на pub.dev. А узнать больше о работе с Google AI Dart SDK — в кратком руководстве.

Фреймворк: прокрутка, анимация, Adaptive Switch

Раньше Flutter-приложения прокручивались в два раза быстрее, если пользователь скроллил двумя пальцами. Теперь можно настроить режим прокрутки по умолчанию ScrollBehavior с помощью MultiTouchDragStrategy.latestPointer. Теперь не важно, скроллит пользователем одним пальцем или двумя — на скорость прокручивания это не влияет. Подробнее можно почитать в руководстве по миграции.

Команда Flutter также исправила ошибки в SingleChildScrollView и ReorderableList и убрала зарегистрированные сбои. Теперь если пользователь перетаскивает элементы или касается их, прокрутка прекращается.

Кроме того, команда обновила виджет TableView в пакете two_dimensional_scrollables: улучшила функциональность, добавила поддержку объединенных ячеек и внедрила больше новых функций 2D foundation.

Стиль анимации

Появился виджет AnimationStyle. С его помощью пользователи могут переопределять поведение анимации по умолчанию в разных виджетах. Например, в MaterialApp, ExpansionTile и PopupMenuButton. А разработчики могут изменять кривые и настраивать продолжительность анимации.

SegmentedButton.styleFrom

Появился статический служебный метод styleFrom. Он позволяет быстро создавать SegmentedButton и ButtonStyle, которыми можно делиться с другими сегментированными кнопками или использовать для настройки SegmentedButtonTheme.

Adaptive Switch

Этот адаптивный компонент выглядит и ощущается, как родной для macOS и iOS. И сохраняет внешний вид Material Design в других ОС. Он не зависит от библиотеки Cupertino, поэтому его API одинаковый на всех платформах. Подробная информация есть на GitHub и на api.flutter.dev.

Параметр Accessibility Identifier в SemanticsProperties

В классе SemanticsProperties появился параметр accessibility identifier. Он позволяет назначить уникальный идентификатор для каждого семантического узла в родной системе обеспечения доступности. Например, на Android он отображается как resource-id, а на iOS устанавливается через UIAccessibilityElement.accessibilityIdentifier.

Расширенный доступ к состоянию текстового виджета

TextField и TextFormField теперь поддерживают MaterialStatesController и могут отслеживать изменения в MaterialState.

UndoHistory stack

В релизе 3.19 была исправлена ошибка, из-за которой на японских клавиатурах иногда неожиданно исчезала история отмены или повтора. Теперь изменять запись можно до того, как она будет помещена в UndoHistory stack.

Движок

Улучшение Impeller: предпросмотр Android OpenGL

В версии 3.16 пользователи смогли протестировать Impeller на устройствах Android с поддержкой Vulkan. Функция появилась на 77% устройств Android.

За последние несколько месяцев команда Flutter довела бэкенд OpenGL в Impeller до уровня бэкенда Vulkan. Например, добавила поддержку MSAA. Теперь Flutter-приложения почти на всех устройствах Android будут отображаться корректно. Исключения составляют небольшое количество функций, которые появятся в ближайшее время. К ним относятся пользовательские шейдеры и поддержка внешних текстур.

В этом году команда планирует сделать Impeller средством визуализации по умолчанию. Если вы заметили какие-то недостатки при включенном Impeller, вы можете сообщить о них команде Flutter. Аппаратная экосистема Android более разнообразна, чем у iOS. Поэтому команда ждет подробные отзывы о проблемах в работе Impeller на разных устройствах и версиях Android.

Дорожная карта

Кроме достижения высокой визуальной точности в предварительной версии Impeller для Android большое внимания уделяется производительности:

  • Чтобы графика была работала плавнее и отзывчивее, команда планирует задействовать Vulkan subpasses.
  • Меняется стратегия рендеринга. Переход от постоянной тесселяции каждого пути на CPU к подходу «Stencil-then-cover» значительно снизит нагрузку на CPU Impeller на Android и iOS.
  • Появилась новая реализация размытия по Гауссу (Gaussian blurring). Ожидается, что она будет соответствовать производительности Skia и улучшит идиоматическое использование размытия на iOS. Это сделает визуальные эффекты более качественными и менее ресурсозатратными.

Улучшения API

Информация о символах

В Flutter 3.19 в объекте Paragraph библиотеки dart:ui появилось два новых метода: getClosestGlyphInfoForOffset и getGlyphInfoAt. Они позволяют получать информацию об отдельных символах в отображаемом тексте. Информация о каждом символе доступна в новом типе данных GlyphInfo. Подробнее можно почитать в документации о GlyphInfo.

Отслеживание графического процессора

Для устройств с Vulkan на Android и macOS, iOS или симуляторов на Metal, движок Flutter теперь записывает время работы графического процессора (GPU) для каждого кадра в режиме отладки и профилирования. Эти данные можно посмотреть в DevTools под заголовком GPUTracer.

Важно! На Android-устройствах без Vulkan функция отслеживания GPU в Inpeller не всегда достоверно определяет, можно ли получить информацию о времени работы GPU. Поэтому на них активировать функцию можно только через флаг в файле AndroidManifest.xml.

Оптимизация производительности

Константы специализации

Impeller теперь поддерживает константы специализации. Эта функция позволила уменьшить несжатый двоичный размер движка Flutter на почти 350 КБ в шейдерах Impeller.

Ускорение фоновой фильтрации

Фоновые фильтры и размытие изображения в Impeller были улучшены:

  • Раньше Impeller ошибочно запрашивал возможность чтения из текстуры на экране. Это обнаружил автор статьи с открытым исходным кодом @knopp. После устранения этого запроса производительность сцен с несколькими фильтрами заднего плана выросла на 20%-70% в зависимости от сложности.
  • Impeller больше не сохраняет буфер трафарета без необходимости для каждого фонового фильтра. Теперь при восстановлении слоя сохранения для фонового фильтра любой клип, влияющий на операции, записывается и воспроизводится в новом буфере трафарета.

В результате при тестировании анимации с использованием расширенных режимов смешивания на Pixel 7 Pro с Impeller и Vulkan среднее время отрисовки кадра на GPU снизилось с 55 мс до 16 мс, а 90% времени работы CPU потока растеризации - с 110 мс до 22 мс.

Android

Веб-валидатор глубоких ссылок

Flutter-разработчики не раз сообщали о сложностях и многочисленных ошибках в реализации глубоких ссылок. Речь идет о переходе пользователей с веб-URL на определенную страницу в мобильном приложении.

Валидатор глубоких ссылок — ранняя версия инструмента проверки, который помогает разработчикам понять, какие ссылки настроены неправильно, и дает рекомендации.

Ранняя версия валидатора позволяет проводить проверку в веб-пространстве Android. Это значит, что вы можете проверить настройку файла assetlinks.json. Для этого откройте DevTools, перейдите на вкладку Deep Links и импортируйте проект Flutter с глубокими ссылками. Валидатор сообщит вам, правильно ли настроен ваш веб-файл. Подробнее читайте в инструкции по тестированию инструмента проверки глубоких ссылок.

Поддержка Share.invoke

Ранее в Android отсутствовала кнопка по умолчанию «Поделиться» для текстовых полей и представлений. Следить за работой по добавлению кнопки «Поделиться» можно по ссылке PR # 107578.

Функция встроенных ресурсов

Если вам нужна совместимость Flutter с функциями из других языков, теперь вы можете выполнять вызовы FFI через Native assets на Android.

Режим гибридной композиции текстурного слоя (TLHC)

В релизе 3.19 значительно увеличилась производительность приложений благодаря тому, что Google Maps и увеличитель ввода текста теперь работают в режиме TLHC. Весь процесс вместе с инструкцией по тестированию THLC можно посмотреть на странице PR 5408.

Пользовательские кнопки в панели выделения текста на Android

В Android-приложениях можно добавлять собственные элементы в меню выделения текста (окно, которое появляется при долгом нажатии на текст). Теперь эти элементы появились и в меню выделения текста виджета TextField в Flutter.

iOS

Шрифты Flutter для iOS

Flutter text теперь выглядит компактнее и ближе к нативному оформлению iOS. Согласно рекомендациям Apple по дизайну, мелкие шрифты на iOS должны быть слегка разреженными, чтобы их было легче читать на мобильных устройствах, а крупные — более компактными, чтобы занимать меньше места. Теперь по умолчанию Flutter будет использовать компактный шрифт для более крупного текста.

Обновления DevTools

  • Появилась функция и раздел в DevTools для проверки настройки deeplinks на Android.
  • В меню «Улучшить отслеживание» (Enhance Tracing) появилась опция отслеживания активности канала платформы. Это пригодится приложениям с плагинами.
  • Экраны производительности и CPU теперь доступны даже без подключенного приложения. Можно повторно загрузить для просмотра сохраненные данные производительности или профили CPU из DevTools.
  • Боковая панель Flutter в VS Code теперь позволяет включать новые платформы, если не используется для текущего проекта. А меню DevTools на боковой панели может открывать DevTools во внешнем окне браузера.

Больше деталей по обновлению DevTools можно почитать на страницах 2.29.0, 2.30.0 и 2.31.0.

Desktop

Поддержка Windows Arm64

Flutter теперь поддерживает архитектуру Arm64 в Windows. Следить за прогрессом можно здесь на GitHub # 62597.

Экосистема

Обязательный манифест о конфиденциальности

Flutter теперь включает манифест о конфиденциальности для iOS. Он соответствует требованиям, которые Apple собирается ввести.

Устаревшие версии и критические изменения

Отказ от поддержки Windows 7 и 8

Dart 3.3 и Flutter 3.19 больше не поддерживают Windows 7 и 8. Команда полностью сконцентрировалась на создании безопасной, эффективной и многофункциональной среды разработки в поддерживаемых версиях Windows.

Флаг размытия импеллера

Как сообщалось в релизных заметках Flutter 3.16, глобальный флаг Paint.enableDithering был удален. Больше информации смотрите в объявление о кардинальных изменениях.

Отказ от поддержки iOS 11

Из-за сбоя при вызове определенных сетевых API Flutter больше не поддерживает iOS 11. Приложения, созданные на основе Flutter 3.16.6 и более поздних версий, не будут запускаться на устройствах с iOS 11.

Устаревший режим автоматического рендеринга

Критические изменения в версии 3.19 касаются устаревших API, срок действия которых истек после выхода версии 3.16. В руководстве по устареванию можно ознакомиться со списком устаревших API и рекомендациями по миграции. Многие из устаревших версий поддерживаются исправлением Flutter fix, включая быстрые исправления в IDE. Массовые исправления можно внести с помощью dart fix.

Пакет flutter_driver включен в планируемое устаревание в дополнение к уже поддерживаемым пакетам flutter и flutter_test.

Заключение

Подробнее об изменениях в выпуске 3.19 можно узнать в примечаниях и журнале изменений.

44
Начать дискуссию