Введение
Погрузитесь в Flutter 3.29! Этот релиз улучшает разработку и повышает производительность, с обновлениями Impeller, Cupertino, DevTools и других. Flutter 3.29, в котором приняли участие 104 уникальных автора, демонстрирует преданность сообщества. Давайте рассмотрим, что нового!
Рамки
Обновления Купертино
CupertinoNavigationBar и CupertinoSliverNavigationBar теперь принимают нижний виджет , обычно поле поиска или сегментированный элемент управления.
В файле CupertinoSliverNavigationBar этот нижний виджет можно настроить с помощью свойства bottomMode так, чтобы он либо автоматически изменял размер до тех пор, пока не будет скрыт, либо всегда отображался при прокрутке панели навигации.
Другие изменения в панелях навигации включают в себя:
При частичной прокрутке CupertinoSliverNavigationBar переключается между развернутым и свернутым состоянием.
Новый CupertinoNavigationBar.large конструктор позволяет статической панели навигации отображать большой заголовок.
Благодаря участнику сообщества davidhicks980 всплывающие окна из Купертино теперь имеют более яркое размытие фона , что повышает исходную точность.

Новое приложение CupertinoSheetRoute отображает модальное представление в стиле iOS, которое можно удалить с помощью жеста перетаскивания.
Новая showCupertinoSheet функция отображает лист с общей встроенной настройкой для вложенной навигации.

Участник сообщества thejitenpatel улучшил CupertinoAlertDialog собственную точность в темном режиме, как показано на следующих снимках экрана:


При инвертировании маркеры выделения текста Flutter меняют свой порядок на iOS, а цвет границы лупы выделения текста теперь соответствует текущей теме.

Material 3
Это FadeForwardsPageTransitionsBuilder - новый конструктор переходов страниц Material 3 (M3), разработанный для соответствия поведению перехода страниц Android последнего поколения. Во время перехода входящая страница скользит справа налево, одновременно постепенно появляясь, а исходящая страница скользит справа налево, постепенно исчезая одновременно. Этот новый переход также решает проблемы производительности, которые ранее вызывались ZoomPageTransitionsBuilder.

В этом выпуске обновлены CircularProgressIndicatorи LinearProgressIndicator для соответствия последним спецификациям Material Design 3. Чтобы использовать обновленный стиль, установите year2023 свойство на false, или установите ProgressIndicatorThemeData.year2023 на false.


В этом выпуске также представлен новейший Sliderдизайн Material 3 с обновленными формами направляющих и ручек. SliderПо умолчанию используется предыдущий стиль Material 3. Чтобы включить новейший дизайн, установите year2023значение false, или установите SliderThemeData.year2023 значение false.

Этот выпуск включает несколько исправлений ошибок и улучшений функций для библиотеки Material. Известные исправления включают:
Навигация с помощью клавиатуры теперь корректно запускает DropdownMenu.onSelected обратный вызов.
Улучшена TabBar анимация эластичной вкладки.
Улучшенное RangeSlider выравнивание большого пальца с помощью разделителей, отступов для большого пальца и скругленных углов.
В дополнение к исправлениям ошибок, этот релиз улучшает настраиваемость нескольких компонентов Material. mouseCursor cвойство было добавлено в Chip, Tooltip, и ReorderableListView, что позволяет настраивать курсоры мыши при наведении.
Выделение текста
Flutter теперь дает вам больше информации о выборе под SelectionArea или SelectableRegionс SelectionListener и SelectionListenerNotifier. SelectionDetails - Объект, доступный через SelectionListenerNotifier, предоставляет вам начальное и конечное смещения выбора (относительно обернутого поддерева) и указывает, существует ли выбор и свернуто ли оно. Для виджета или выбираемого поддерева, которые вы хотите прослушивать, оберните его с помощью SelectionListener виджета.
Flutter также предоставляет вам информацию о статусе SelectionArea или SelectableRegion через унаследованный виджет SelectableRegionSelectionStatusScope. Вы можете проверить, активно ли родитель SelectionArea или SelectableRegion изменяет или завершил свой выбор, используя SelectableRegionSelectionStatusScope.maybeOf(context)и проверяя SelectableRegionSelectionStatus.

Доступность
В этом выпуске улучшена доступность нескольких виджетов Material:
Если включена программа чтения с экрана, виджет формы сообщает только о первой обнаруженной ошибке.
Программа чтения с экрана теперь озвучивает правильную метку для раскрывающихся меню.
Веб
При первоначальном выпуске в мае 2024 года поддержка Flutter WebAssembly (wasm) в Интернете требовала от вас размещать приложения Flutter со специальными заголовками ответа HTTP. Теперь это требование смягчено. Хотя обновление заголовков позволяет веб-приложениям Flutter, созданным с помощью wasm, работать с несколькими потоками, использование заголовков по умолчанию теперь позволяет приложению работать с wasm, но ограничено одним потоком.
Мы исправили несколько проблем с изображениями на бэкэндах WebGL, но наиболее важными из них являются:
Декодирование изображений асинхронно вне потока пользовательского интерфейса для избежания задержек
Заставляем Image.network работать с изображениями CORS «из коробки»
Движок
Стабильность импеллера Vulkan
Благодаря отзывам и сообщениям об ошибках в бета-версии 3.27 и стабильной версии был внесен ряд улучшений корректности и производительности бэкэнда Vulkan, в том числе:
Исправлено воспроизводимое мерцание и визуальное дрожание, о которых сообщали многие пользователи старых устройств с поддержкой Vulkan.
Отключены свопчейны аппаратного буфера Android. Эта функция была помечена флагом до тех пор пока не будет установлено, что она работает правильно на устройствах Android.
Большое количество отчетов о черном экране и сбоях было результатом использования Vulkan на MediaTek/PowerVR soc. Эти устройства теперь используют только Impeller OpenGLES (см. ниже).
Эмуляторы Android были обновлены для использования бэкэнда Impeller GLES.
Импеллер OpenGLES
В версии 3.29 устройства Android, не имеющие функционального драйвера Vulkan, будут использовать Impeller, работающий на OpenGLES, вместо использования Skia. Это поведение включено по умолчанию и не требует настройки. Это обеспечивает поддержку Impeller на Android для 100% поддерживаемых Flutter устройств Android.
Импеллер на iOS
Поддержка Skia была удалена из бэкэнда iOS, и FLTEnableImpellerфлаг отказа больше не работает. Дальнейшее сокращение размера двоичных файлов ожидается в будущих выпусках, поскольку мы начинаем удалять компоненты Skia из сборок iOS.
Новые возможности
В этом выпуске представлен ряд новых функций, использующих преимущества бэкэнда Impeller.
Оптимизация фонового фильтра
Приложения, отображающие несколько фоновых фильтров, теперь могут использовать новый виджет BackdropGroup и новый BackdropFilter.grouped конструктор. Они могут улучшить производительность множественных размытий сверх того, что было возможно на бэкенде Skia. Для примера посетите исходный код basic.dart .
ImageFilter.шейдер
Новый ImageFilter конструктор позволяет применять пользовательский шейдер к любым дочерним виджетам. Это обеспечивает схожую функциональность с AnimatedSampler виджетом из package:flutter_shaders, за исключением того, что он также работает с фоновыми фильтрами. Для примера посетите исходный код painting.dart .
Изменения потоков Dart на Android/iOS
Ранее Flutter выполнял код Dart в другом потоке (поток пользовательского интерфейса), нежели основной поток платформы. Это позволяло повысить теоретическую пропускную способность, если были заняты как потоки платформы, так и потоки пользовательского интерфейса, но это приводило к тому, что для большинства взаимодействий с платформой требовалась сериализованная и асинхронная передача сообщений. Эта архитектура также имела косвенные эффекты для ввода текста, доступности, плагинов и т. д.
Начиная с версии 3.29, Flutter на Android и iOS выполняет код Dart в основном потоке приложения, и больше нет отдельного потока пользовательского интерфейса. Это первая часть в серии изменений по улучшению взаимодействия платформы на мобильных платформах, поскольку она позволяет выполнять синхронные вызовы на платформу и с нее без накладных расходов на сериализацию и передачу сообщений.
DevTools и IDE
Новый инспектор DevTools
Новый инспектор DevTools включен по умолчанию для всех пользователей. Новый инспектор имеет сжатое дерево виджетов, новый вид свойств виджета и возможность автоматического обновления в ответ на события горячей перезагрузки и навигации. Для получения более подробной информации посетите страницу нового инспектора на docs.flutter.dev.

Изменения в выборе виджетов на устройстве
После включения режима выбора виджета из инспектора DevTools любой выбор на устройстве считается выбором виджета, пока вы не выйдете из режима выбора виджета. Раньше после первоначального выбора виджета вам нужно было нажать кнопку Select widget на устройстве , чтобы выбрать другой виджет. Вместо этого теперь есть кнопка на устройстве, которую можно использовать для быстрого выхода из режима выбора виджета.

Улучшения инструмента ведения журнала
Инструмент ведения журнала в DevTools был улучшен следующим образом:
Журналы включают и отображают больше метаданных, таких как уроверь критичности лога, категория, зона и изоляция.
Добавлена поддержка фильтрации по уровню серьезности журнала.
Значительное улучшение производительности и времени начальной загрузки.

Это всего лишь несколько основных моментов этого релиза. Чтобы узнать больше обо всех обновлениях, включенных в Flutter 3.29, ознакомьтесь с примечаниями к выпуску DevTools 2.41.0 и 2.42.2 .
Критические изменения и устаревание
Поддержка пакетов
Мы планируем прекратить поддержку следующих пакетов 30 апреля 2025 года:
ios_platform_images; см. ios_platform_images, поддержку которого планируется прекратить #162961
css_colors; см. css_colors, поддержку которого планируется прекратить #162962
palette_generator; см. palette_generator, поддержку которого планируется прекратить #162963
flutter_image; см. flutter_image прекращено #162964
flutter_adaptive_scaffold; см. flutter_adaptive_scaffold, поддержку которого планируется прекратить #162965
flutter_markdown; см. flutter_markdown, который планируется прекратить #162966
Мы призываем всех заинтересованных членов сообщества координировать создание и поддержание форков. Ссылки на вопросы приведены выше для обсуждения и координации.
Удаление скриптового приложения плагина Flutter Gradle
Удаление скриптового приложения плагина Flutter Gradle, который устарел с версии 3.19. Это поддерживает преобразование плагина Flutter Gradle из Groovy в Kotlin и его миграцию на использование открытого API AGP. Ожидается, что эта работа снизит частоту поломок при публикации новой версии AGP и сократит регрессии на основе сборки.
Проекты, созданные до версии 3.16, которые еще не были перенесены, скорее всего, будут затронуты. Если инструмент flutter регистрирует предупреждение: «Вы применяете основной плагин Gradle Flutter императивно» при сборке вашего проекта, это повлияет на вас и вам необходимо выполнить миграцию в соответствии с Устаревшим императивным применением плагинов Gradle Flutter на docs.flutter.dev.
Удаление веб-рендерера HTML
Это первый релиз, в котором HTML-рендерер был удален из Flutter web. Для получения дополнительной информации посетите The intention to deprecate and remove the HTML renderer in Flutter web и Issue 145584: Intent to deprecate and remove the HTML renderer in Flutter web .
Обработка веб-изображений
Этот выпуск также дает вам больше контроля над тем, как изображения отображаются в Вебе . В предыдущем бета-выпуске (3.28) виджеты изображений автоматически использовали <img> элементы для отображения изображений из URL-адресов при возникновении ошибок CORS. Это могло привести к непоследовательному поведению. Теперь флаг webHtmlElementStrategy позволяет вам выбирать, когда использовать <img> элементы. Хотя этот резервный вариант отключен по умолчанию, вы все равно можете включить резервный вариант или даже приоритизировать <img> элементы, если это необходимо для вашего приложения.
Нормализация материала
В рамках нашего текущего проекта по нормализации тем в Material этот выпуск устарел ThemeData.dialogBackgroundColorв пользу DialogThemeData.backgroundColor. Вы можете использовать dart fixкоманду для переноса затронутого кода.
Кроме того, в Material это ButtonStyleButton iconAlignment свойство было объявлено устаревшим после добавления к ButtonStyle связанным с ним styleFrom методам.
Информацию обо всех критических изменениях в этом выпуске см. в полном списке рекомендаций по миграции на странице критических изменений веб-сайта.
Как всегда, большое спасибо сообществу за предоставление тестов — они помогают нам выявлять критические изменения. Чтобы узнать больше, ознакомьтесь с политикой Flutter в отношении критических изменений .
Заключение

Спасибо сообществу Flutter за то, что сделали этот релиз возможным! Мы с нетерпением ждем будущего и с нетерпением ждем ваших приложений. Проверьте заметки о выпуске и журнал изменений , затем запустите flutter upgradeи начните сборку!