[Перевод] Что нового в Flutter 3.19
Интеграция с искусственным интеллектом, обновления Impeller и поддержка Windows Arm64: делимся первым переводом официального релиза 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 можно узнать в примечаниях и журнале изменений.
Flutter 3.19 вместе с Dart 3.3 теперь доступен на стабильном канале.