Что нового в 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").

Для более тонкого управления жестами виджет InkWell теперь имеет коллбэк onLongPressUp (#173221), полезный для запуска действий, которые должны завершиться только при отпускании пальца.
Библиотека Cupertino также продолжает путь к лучшей точности iOS. CupertinoSlidingSegmentedControl добавляет свойство isMomentary (#164262), позволяющее триггерить действия без сохранения выбора. Чтобы лучше соответствовать нативному поведению iOS, CupertinoSheet теперь имеет тонкий эффект "растяжения" при перетаскивании вверх в полностью расширенном состоянии (#168547).
Наконец, этот релиз наполнен улучшениями, которые полируют поведение ключевых компонентов. Среди них: исправление DropdownMenuFormField для корректной очистки поля при сбросе формы (#174937) и обновления SegmentedButton для улучшения обработки фокуса (#173953) и корректного отображения границы в зависимости от состояния виджета (#172754).
Разделение Material и Cupertino
Мы активно планируем разделение библиотек Material и Cupertino от фреймворка.
- Улучшение процесса релизов для flutter/packages, включая Material и Cupertino после разделения.
- Статус: Решено
- Идеи: Стратегия релизов первых партий пакетов
- Решено: Одностраничник пакетных релизов (публично доступно)
- Цвета и сокращения точек
- Статус: Решено
- Базовый набор цветов для Flutter (публично доступно)
- Разделение тестов
- Статус: В процессе
- Разделение тестов фреймворка (публично доступно)
- Иssue
- Текст
- Статус: В обсуждении
- Дизайн разделения Flutter от текста (публично доступно)
Прокрутка: более надёжные и предсказуемые слайдеры
Этот релиз вносит исправления, делающие создание сложных макетов прокрутки, особенно с использованием 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-приложений
- Ручная миграция: инструкции на сайте Flutter.
- Автоматическая миграция (экспериментальная):
flutter config --enable-uiscene-migration
Миграция Flutter-плагинов
- Плагины должны обновиться для работы с UIScene (руководство по миграции).
Миграция встроенных 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.
Документация и обратная связь:
- Начало работы с предварительными просмотрами Flutter-виджетов
- GitHub репозиторий для запросов на ошибки и функции
- Документ по архитектуре предварительных просмотров
Обновления 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