От Нot reload для Web до макросов в IceBox: хроники Flutter-марта

Привет, Хабр! На связи Friflex. Мы разрабатываем мобильные приложения и специализируемся на Flutter (работаем с фреймворком с первой версии).
Это первый выпуск нашего флаттер-дайджеста. Пока думаем делать его каждый месяц и рассказывать, что важного произошло в фреймворке и сообществе лично для нас.
Вот что нового во Flutter-вселенной случилось в марте.
1. Примеры использования макросов удалили из репозитория
Сама функция осталась, но ее переместили в IceBox. F макросы… Мы как разрабы не унываем. Думаем, что пока будут делать больший упор на оптимизацию build_runner и, возможно, когда-нибудь добавят макросы в другом виде. А может, приблизят язык к конкурентам с натива?
Параллельно идет отделение функционала аугментаций (augmentations) в отдельную экспериментальную возможность со своим флагом.
2. Hot Reload для Flutter Web — теперь в бета-версии
До недавнего времени эта функция была недоступна для Web, и каждый запуск сбрасывал состояние и навигационный стек. Теперь в бета-канале Flutter появилась экспериментальная поддержка горячей перезагрузки для Web.
Ура-ура! В перспективе, когда понадобится мигрировать проект с мобильной версии или десктопа на Web, разработку можно будет ввести полностью опираясь на него и пользоваться всем удобством языка. Ультраполезная и глобальная вещь в развитии движка, которая (уверены) закрепит позиции фреймворка среди остальных конкурентов.
Как включить:
Переключитесь на бета-канал:

2. Запустите приложение с флагом:

3. Для VS Code можно добавить флаг в launch.json
:

3. Обновления Flutter DevTools
Обновленный Performance View
Добавили более подробные временные диаграммы — теперь на них проще отслеживать заморозки UI, дорогостоящие операции и фреймы, которые выбиваются из 60 FPS.
Frame Analysis
Новый инструмент позволяет детально разбирать каждый кадр рендеринга: время компоновки, отрисовки, привязки к GPU и задержки платформы. Это особенно полезно при оптимизации сложных UI-элементов.
Memory View
Улучшили отображение и визуализацию используемой памяти. Добавили возможность отслеживать утечки объектов и аномальный рост heap. Крайне полезный апдейт! Еще бы сделали DevTools, которые помогали бы смотреть SQLite (если он есть в проекте) по таблицам на уровне Room в Android.
4. Пакеты video_player, google_maps_flutter, talker_flutter обновились
video_player
— версия 2.9.3
Исправили ошибку с неправильной обработкой WebVTT-субтитров, особенно если в них используются многострочные блоки.
google_maps_flutter
— версия 2.10.1
Ничего необычного, но приятно: обновили документацию API, добавили поддержку последних версий Flutter SDK.
talker_flutter
— версия 4.6.12
Устранили конфликт с расширением firstWhereOrNull
из пакета collection
, которое могло ломать сборку, если использовались одинаковые импорты в разных частях приложения.
5. У пакетов на pub.dev появилась версия загрузочной аналитики
Теперь можно смотреть не просто количество загрузок, а по каким именно версиям пользователи скачивают пакет.
Что добавили:
Три режима отображения графика: наложение, без наложения и по процентам.
Группировка по мажорным, минорным и патч-версиям.
Всё это — во вкладке score на странице любого пакета.
Зачем это нужно? Разработчикам библиотек — чтобы понимать, какие версии реально используют, кто сидит на старых релизах и насколько успешно заходит новая версия.
Выглядит как шаг в сторону серьезной аналитики. Полезно, особенно если ты мейнтейнишь популярный пакет.
6. Кажется, команда Dart снова копается в конструкторах
В спецификации появился черновик новой фичи — Generic Constructors.
Вроде как только обсуждали Enhanced Constructors, а теперь еще один заход.
Теперь можно будет задавать типовые параметры прямо в конструкторах, отдельно от класса. Это полезно, когда нужно выразить зависимость между аргументами конструктора, но не хочется тащить generic на весь тип.
Планируют два варианта:
Простой: избавляет от
Object?
иFunction
в ситуациях, где хочется типов.Условный: позволяет писать конструкторы, доступные только при
X extends Comparable
и подобном.
Похоже, в команде Dart реально любят конструкторы. Счет уже сбился: обычный, фабричный, именованный, константный, расширенный, теперь еще и generic.
Но пока это только в черновиках — следим, куда заведет.
7. Плагин Flutter для VS Code обновился
Команда Dart: Go to Imports позволяет быстро перейти к нужной директиве import в файле.
Файл analysis_options.yaml (внутри lib/) не мешает автодополнению кода.
В отладочной консоли стек вызовов теперь содержит кликабельные ссылки на файлы SDK — это упрощает навигацию по исходникам.
Подробнее об изменениях — в официальном списке релиза.
7. Вышел Flutter 3.29.2, конечно же
Устранили сбои на Android-устройствах с API ниже 29 при использовании Impeller с OpenGLES. Теперь в документации четко указано, что Impeller для версии API ниже 29 может не поддерживать некоторый функционал, что приводит к ошибкам. Вместо него используется Skia https://github.com/flutter/flutter/pull/165090
Исправили сбой, возникавший при одновременной анимации и скроллинге на всех платформах. https://github.com/flutter/flutter/pull/164392
Улучшили производительность CanvasKit для Flutter Web https://github.com/flutter/flutter/pull/163175 и устранили проблему с двойной загрузкой canvaskit.wasm. https://github.com/flutter/flutter/pull/162198
Исправили проблему отсутствия глифов на Android и iOS. https://github.com/flutter/flutter/pull/165055
На iOS увеличили количество параллельных задач для декодирования изображений — это помогает избежать сбоев при потере доступа к GPU. https://github.com/flutter/flutter/pull/164036
Полный список изменений — здесь.
Как вам мартовские обновления?
Над выпуском работали: Роман Галиновский (Flutter Dev Friflex), Анна Ахлестова (Flutter Team Lead Friflex).