Что нового в Flutter 3.38

Что нового в Flutter 3.38

FlutterPulse

Эта статья переведена специально для канала FlutterPulse. В этом канале вы найдёте много интересных вещей, связанных с Flutter. Не забывайте подписываться! 🚀

Добро пожаловать обратно в наш регулярный ежеквартальный релиз — Flutter 3.38. Это обновление сосредоточено на повышении вашей продуктивности и улучшении опыта разработчика благодаря новым сокращениям точек (dot shorthands) и улучшениям в предварительном просмотре виджетов. Благодаря нашему сообществу, в этом релизе участвовали 825 коммитов от 145 уникальных участников, из которых 37 — впервые. Давайте разберёмся, что нового.


Сокращения точек (dot shorthands)

Пишите более лаконичный Dart-код! Мы рады представить новую функцию Dart — сокращения точек! Они уменьшают объём шаблонного кода, позволяя опускать типы, которые Dart может вывести самостоятельно.

Например, вы можете использовать сокращения, чтобы написать `.start` вместо `MainAxisAlignment.start`.

// С сокращениями
Column(
  mainAxisAlignment: .start,
  crossAxisAlignment: .center,
  children: [ /* ... */ ],
),

// Без сокращений
Column(
  mainAxisAlignment: MainAxisAlignment.start,
  crossAxisAlignment: MainAxisAlignment.center,
  children: [ /* … */ ],
),

Это также работает для именованных конструкторов! Вы можете написать .all вместо EdgeInsets.all:

Padding(
  padding: .all(8.0),
  child: Text('Hello world'),
),

Конфигурационные файлы для веб-разработки

Команда flutter run теперь поддерживает конфигурационный файл для настроек веба. Это позволяет указывать хост, порт, сертификат и заголовки в файле web_dev_config.yaml в корне вашего проекта. Зафиксируйте файл в репозитории, чтобы все участники команды отлаживали приложение с одинаковыми настройками.

Подробнее: настройка конфигурационного файла веб-разработки.

Настройки прокси для веб-разработки

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

Подробности о настройках прокси также доступны в документации по конфигурационному файлу веб-разработки.

Расширенная поддержка горячей перезагрузки на вебе

Горячая перезагрузка с сохранением состояния теперь включена по умолчанию при запуске с флагом -d web-server и открытии ссылки на ваше Flutter-приложение в браузере. Это работает даже при одновременном подключении нескольких браузеров.

Как и с -d chrome, эту функцию можно временно отключить с помощью флага --no-web-experimental-hot-reload. Возможность отключения будет удалена в будущих релизах, поэтому, если вы столкнётесь с проблемами в вашем рабочем процессе, пожалуйста, сообщите об этом, используя шаблон проблемы горячей перезагрузки веба.

Подробнее: документация по горячей перезагрузке на вебе.


Фреймворк

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

Разработчики теперь получили больше возможностей при создании всплывающих окон, диалогов и других плавающих элементов UI с помощью OverlayPortal. Теперь можно отображать дочерний виджет в любом Overlay выше по дереву виджетов с помощью OverlayPortal.overlayChildLayoutBuilder (#174239), что упрощает показ уведомлений или других элементов UI, которым нужно выйти за пределы ограничений родительского виджета. Метод Overlay.of также стал более надёжным и эффективным (#174315).

Для более современного опыта навигации на Android предиктивные переходы назад теперь включены по умолчанию в MaterialApp (#173860). Когда пользователь выполняет жест назад, он теперь видит предварительный просмотр главного экрана, пока текущий маршрут анимированно уходит. Кроме того, переход по умолчанию был обновлён с ZoomPageTransitionsBuilder на FadeForwardsPageTransitionsBuilder, чтобы лучше соответствовать нативному поведению.

Этот релиз также углубляет интеграцию с десктопом. На Windows разработчики теперь могут получить список подключённых мониторов и запросить подробные свойства каждого, такие как разрешение, частота обновления и физический размер (#164460). Это позволяет создавать приложения с продвинутыми функциями управления окнами.

Наконец, сам фреймворк стал более устойчивым. Ошибки, возникающие в коллбэках жизненного цикла виджетов (например, didUpdateWidget), теперь обрабатываются более грациозно, предотвращая каскадные сбои в дереве элементов (#173148). ResizeImage теперь правильно реализует равенство, что делает кэширование и сравнение изображений более предсказуемым (#172643).

Material и Cupertino

Библиотеки Material и Cupertino продолжают развиваться с фокусом на согласованность API и отполированный пользовательский опыт. Этот релиз принёс крупную миграцию API, новые возможности виджетов и множество улучшений, делающих создание красивых и функциональных интерфейсов проще.

На основе устаревания MaterialState, этот релиз продолжает внутреннюю миграцию на более унифицированный WidgetState. Это обеспечивает согласованный, выразительный способ определения внешнего вида виджета в разных состояниях взаимодействия (нажато, наведено, отключено) и не требует изменений для существующих приложений. Миграция применена к широкому спектру виджетов и их тем, включая IconButton, ElevatedButton, Checkbox и Switch (#173893). Новый API также добавляет мощь и гибкость: например, IconButton теперь включает свойство statesController (#169821), позволяющее программно управлять его визуальными состояниями и открывая возможности для более кастомных и интерактивных дизайнов.

Этот релиз также представляет несколько новых функций и удобных API. Конструктор Badge.count теперь включает параметр maxCount (#171054), позволяющий легко ограничить отображаемое значение (например, показывать "99+" вместо "100").

Пример Badge с maxCount


Для более тонкого управления жестами виджет InkWell теперь имеет коллбэк onLongPressUp (#173221), полезный для запуска действий, которые должны завершиться только при отпускании пальца.

Библиотека Cupertino также продолжает путь к лучшей точности iOS. CupertinoSlidingSegmentedControl добавляет свойство isMomentary (#164262), позволяющее триггерить действия без сохранения выбора. Чтобы лучше соответствовать нативному поведению iOS, CupertinoSheet теперь имеет тонкий эффект "растяжения" при перетаскивании вверх в полностью расширенном состоянии (#168547).

Наконец, этот релиз наполнен улучшениями, которые полируют поведение ключевых компонентов. Среди них: исправление DropdownMenuFormField для корректной очистки поля при сбросе формы (#174937) и обновления SegmentedButton для улучшения обработки фокуса (#173953) и корректного отображения границы в зависимости от состояния виджета (#172754).


Разделение Material и Cupertino

Мы активно планируем разделение библиотек Material и Cupertino от фреймворка.


Прокрутка: более надёжные и предсказуемые слайдеры

Этот релиз вносит исправления, делающие создание сложных макетов прокрутки, особенно с использованием SliverMainAxisGroup и SliverCrossAxisGroup, более надёжным.

  • Обработка жестов на слайверах внутри групп теперь корректна (#174265).
  • Исправлены проблемы с перепрокручиванием при закреплённом заголовке (#173349).
  • Вызов showOnScreen работает корректно (#171339).
  • Новый конструктор SliverGrid.list предлагает более чистый способ создания сетки из простого списка дочерних элементов (#173925).

Навигация по фокусу для пользователей клавиатуры и D-pad в сложных макетах также улучшена (#172875).


Доступность: более инклюзивный опыт

Создание приложений, доступных для всех пользователей, остаётся приоритетом Flutter.

  • iOS: доступность включается по умолчанию через WidgetsFlutterBinding.instance.ensureSemantics (#174163).
  • debugDumpSemanticsTree теперь включает дополнительную информацию о проверке ввода текста (#174677).
  • Новый виджет SliverSemantics позволяет аннотировать части дерева слайверов для средств чтения с экрана (#167300).
  • CupertinoExpansionTile теперь доступен по умолчанию (#174480).
  • Виджет AutoComplete сообщает пользователю статус результатов поиска (#173480).
  • Улучшенные целевые области касания в TimePicker (#170060).

iOS

Flutter полностью поддерживает последние версии платформы: iOS 26, Xcode 26 и macOS 26.

  • Новый метод развертывания с использованием devicectl устраняет необходимость запуска Xcode при flutter run.
  • Ранее автоматизация Xcode была нестабильной на Xcode 26.
  • Миграция жизненного цикла UIScene обязательна для совместимости с будущими версиями iOS.

Миграция Flutter-приложений

  1. Ручная миграция: инструкции на сайте Flutter.
  2. Автоматическая миграция (экспериментальная):
flutter config --enable-uiscene-migration

Миграция Flutter-плагинов

Миграция встроенных Flutter (опционально)

  • Рекомендуется, но не обязательна, для хост-приложений.

Совместимость с размером страницы 16 КБ

Обновление до Flutter 3.38 является подготовкой к требованию Google Play о совместимости с размером страницы 16 КБ.

  • С 1 ноября 2025 года приложения, нацеленные на Android 15 и выше, должны поддерживать 16 КБ страницы.
  • Это улучшает производительность, включая до 30% более быстрый запуск.
  • Flutter 3.38 обновляет ndkVersion по умолчанию до NDK r28 — минимальной требуемой версии для поддержки 16 КБ в нативном коде.

Исправления памяти

Flutter 3.38 исправляет значительную утечку памяти на Android, возникшую в версии 3.29.0. Проблема появлялась при уничтожении Activity системой или разработчиком.

Обновления зависимостей Android

Для Flutter 3.38 протестированы и подтверждены совместимости:

  • Java 17: минимальная версия для разработки Android.
  • Kotlin Gradle Plugin (KGP) 2.2.20: максимальная известная поддерживаемая версия.
  • Android Gradle Plugin (AGP) 8.11.1: совместим с KGP 2.2.20.
  • Gradle 8.14: работает с выбранными версиями Java, KGP и AGP.

Рекомендуется использовать переменные уровня API Flutter SDK:

  • flutter.compileSdkVersion (API 36)
  • flutter.targetSdkVersion (API 36)
  • flutter.minSdkVersion (API 24) или выше

Двигатель

Перекрытие производительности

Рефакторинг улучшил эффективность, сократив время рендеринга на Skia и Impeller (#176364).

Vulkan и OpenGL ES

Исправления и улучшения повышают стабильность и производительность, включая кеши пайплайнов, ожидатели фенсов и переходы макетов изображений (#176322, #173085, #173884).

Унификация рендерера

CanvasKit и Skwasm теперь делят больше общего кода, обеспечивая более согласованный опыт и ускоряя разработку (#174588).

Объединение потоков

Возможность отключить объединение потоков была удалена с iOS и Android (ссылка на видео).


DevTools и IDE

Экспериментальные предварительные просмотры виджетов — обновления

  • Интеграция с IDE: VSCode и IntelliJ/Android Studio поддерживают превью виджетов.
  • Улучшения тематизации: светлый/тёмный режим, пользовательские цветовые схемы IDE.
  • Расширяемость превью: аннотация @Preview больше не final, поддержка MultiPreview и групп превью.
  • Снижение ограничений на аргументы @Preview.

Документация и обратная связь:

Обновления DevTools

  • Улучшена панель сети: запись трафика и исправления копирования/вставки.
  • Исправления Flutter Inspector: выбор виджета и верхние кнопки панели (#176530, #9327).

Устаревания и ломающие изменения

  • Файл version удалён, теперь используется flutter.version.json (#172793).
  • Файл AssetManifest.json больше не генерируется по умолчанию (#172594).
  • SnackBar с действием больше не исчезает автоматически (#173084).
  • OverlayPortal.targetsRootOverlay устарел в пользу OverlayPortal(overlayLocation: OverlayChildLocation.rootOverlay).
  • Свойства CupertinoDynamicColor (withAlpha, withOpacity) устарели в пользу методов Color (#171160).
  • Flutter 3.38 требует Java 17 для Android.

Подробности и руководство по миграции: страница ломающих изменений.


Заключение

Flutter 3.38 делает разработку быстрее и приятнее. Улучшения упрощают процесс создания UI, увеличивают производительность и надёжность приложений.

Чтобы воспользоваться обновлениями, запустите:

flutter upgrade

Report Page