Горячая перезагрузка, предварительный просмотр виджетов и многое другое

Введение

Добро пожаловать в ежеквартальный релиз Flutter 3.35! Это обновление призвано повысить вашу продуктивность и включает в себя стабильную версию горячей перезагрузки с сохранением состояния в веб-версии и экспериментальный запуск предпросмотра виджетов! Благодаря усилиям нашего сообщества, Flutter 3.35 включает в себя 1108 коммитов от 168 уникальных участников, 39 из которых присоединились к нам впервые. Давайте узнаем, что нового!

Web

Горячая перезагрузка с учетом состояния в Web теперь включена по умолчанию.

Мы рады объявить об этом важном событии для Flutter в Web и приглашаем всех добавить горячую перезагрузку в свой рабочий процесс веб-разработки.

Положительные отзывы и сообщения об ошибках, полученные нами на экспериментальном этапе, очень помогли. Веб-команды Dart и Flutter активно работали над повышением производительности кода с горячей перезагрузкой, обеспечивая при этом возможность успешной горячей перезагрузки большего количества изменений кода.

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

Пробные прогоны Wasm

В преддверии включения WebAssembly (Wasm) в качестве целевой платформы веб-сборки по умолчанию каждая сборка JS теперь выполняет «пробную» компиляцию в Wasm. Серия проверок определяет готовность вашего приложения к Wasm, и любые результаты выводятся в консоль в виде предупреждений. Эту функцию можно отключить с помощью соответствующего --(no-)wasm-dry-runфлага.

Что нового?

Раньше приходилось явно включать горячую перезагрузку с сохранением состояния в веб-приложении с помощью экспериментального флага. Теперь при запуске веб-приложения Flutter горячая перезагрузка с сохранением состояния доступна сразу! Независимо от того, запускаете ли вы веб-приложение Flutter из командной строки или из IDE или агента кодирования, просто запустите его в режиме разработки и свободно используйте горячую перезагрузку.

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

Обратная связь

Мы понимаем, что у каждого может быть своя среда разработки, поэтому, если ваша среда разработки не работает из-за этого изменения, вы можете --no-web-experimental-hot-reloadвременно отключить горячую перезагрузку с помощью соответствующего флага. Если вы обнаружите какие-либо проблемы, пожалуйста, сообщите об ошибке, используя шаблон Dart для горячей перезагрузки . Подробнее см. в документации по горячей перезагрузке на сайте .

Что дальше?

Текущая активная работа позволит реализовать горячую перезагрузку в большем количестве сред разработки, включая-d web-server. Мы рассчитываем, что это повысит вашу продуктивность при веб-разработке, поэтому следите за будущими релизами!

Рамки

Более инклюзивный и доступный опыт

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

Более богатая семантика в Web

Мы добились значительных успехов в улучшении взаимодействия веб-приложений Flutter с программами чтения с экрана и другими инструментами. Для пользователей из разных стран мы добавили поддержку семантических локалей ( #171196 ), гарантируя, что функции доступности будут представлены на предпочитаемом пользователем языке.

Новые инструменты для создания доступных виджетов

Разработчики теперь имеют более мощные инструменты для создания сложных и доступных интерфейсов. Новый SemanticsLabelBuilderвиджет ( #171683 ) упрощает процесс объединения нескольких точек данных в единое, связное объявление без необходимости сложного объединения строк.

Для сложных прокручиваемых представлений можно использовать новый SliverEnsureSemanticsвиджет ( #166889 ) для переноса сегментов, гарантируя, что они всегда будут представлены в дереве семантики, даже если они прокручены за пределы поля зрения.

Улучшение основных виджетов и платформы

В этом выпуске содержится множество исправлений, улучшающих доступность основных виджетов.

  • В iOS CupertinoSliverNavigationBarтеперь корректно учитывается масштабирование доступного текста ( #168866 ), а поведение активации вкладок VoiceOver теперь работает корректно ( #170076 ).

  • Для Android проблемы с Talkback теперь работают при использовании представлений платформы ( #168939 ), что является критическим исправлением для приложений, в которые встроены собственные компоненты.

  • Свойства семантики для CustomPainter#168113 ) теперь заполнены, что позволяет вам сделать ваш специально созданный пользовательский интерфейс полностью доступным.

  • Панель инструментов выбора текста теперь правильно выровнена для языков с письмом справа налево (RTL), что улучшает возможности для глобальной аудитории ( #169854 ).

Material и Cupertino: больше мощи и блеска

Библиотеки Material и Cupertino продолжают развиваться, предоставляя вам больше контроля над внешним видом и функционированием вашего приложения.

Новые и улучшенные компоненты

Мы добавили совершенно новые, пользующиеся большим спросом компоненты и внесли существенные улучшения в уже существующие.

  • Представляем DropdownMenuFormField ( #163721 ): теперь вы можете легко интегрировать M3 DropdownMenuнепосредственно в свои формы.

  • Прокручиваемая навигационная панель ( #169421 ): теперь ее NavigationRailможно настроить на прокрутку в случаях, когда пунктов назначения больше, чем может поместиться на экране.

  • Верхний и нижний колонтитулы NavigationDrawer ( #168005 ): теперь вы можете добавить верхний и нижний колонтитулы NavigationDrawer, что обеспечивает большую гибкость макета.

  • Представляем CupertinoExpansionTile ( #165606 ): создавайте расширяемые и сворачиваемые элементы списка с помощью нового CupertinoExpansionTileвиджета.

Более высокая точность и интерактивность

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

  • Многие виджеты Купертино были обновлены с использованием RSuperellipseформы ( #167784 ), что придает им характерный вид с непрерывными углами, который ожидают пользователи iOS.

  • Чтобы сделать приложения более живыми и естественными, мы добавили тактильную обратную связь к ключевым интерактивным компонентам, таким как CupertinoPicker#170641 ) и CupertinoSlider#167362 ).

  • Индикатор Sliderзначения теперь можно настроить так, чтобы он всегда был видимым ( #162223 ).

Больше из фреймворка

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

Более мощные slivers

Для разработчиков, создающих сложные интерфейсы прокрутки, теперь можно явно контролировать порядок отрисовки (или z-порядок) лент ( #164818 ), что позволяет правильно реализовывать расширенные эффекты, такие как «липкие» заголовки, которые перекрывают другие ленты без визуальных сбоев.

Более детальный контроль над навигацией и формами

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

  • Полноэкранные диалоги ( #167794 ): свойство fullscreenDialogдобавлено в ModalRoute (и все его потомки) и в showDialog. Это позволяет настраивать поведение навигации по диалоговым маршрутам и обратно.

  • Улучшения форм ( #167060 ): FormField теперь включает обратный вызов onReset, что упрощает обработку логики очистки формы.

Поддержка многооконного режима (движок)

Наши друзья из Canonical продолжают добиваться значительного прогресса в реализации поддержки многооконных приложений! В этом выпуске они реализовали базовую логику создания и обновления окон в Windows и macOS ( #168728 ). В последующих выпусках будут обновлены Linux и представлены экспериментальные API для реализации многооконного режима. Следите за новостями!

Уточнение ввода и выбора текста

Ввод текста является основополагающей частью пользовательского опыта, и в этой версии реализовано несколько усовершенствований, которые делают его более мощным и предсказуемым.

  • Более унифицированная система жестов: введение интерфейса PositionedGestureDetails#160714 ) унифицирует детали для всех жестов указателя и позволяет писать более универсальный код обработки жестов.

  • Однострочная прокрутка iOS ( #162841 ): для лучшего соответствия собственному поведению iOS однострочные текстовые поля больше не могут прокручиваться пользователем.

Поддержка клавиш «Home» и «End» для Android ( #168184 ): мы добавили поддержку сочетаний клавиш Homeи Endна Android.

Взгляд в будущее: разделение библиотек дизайна Flutter

По мере того, как экосистема Flutter продолжает расти и развиваться, её основная структура должна развиваться. Ключевой элемент этого развития — обеспечение того, чтобы все компоненты Flutter могли развиваться в темпе, наиболее отвечающем потребностям сообщества.

С этой целью мы начинаем процесс переноса библиотек Material и Cupertino из основного фреймворка Flutter в отдельные пакеты. Мы только начинаем эту работу и, как всегда, делаем это открыто и в сотрудничестве с нашим сообществом разработчиков.

Почему ситуация меняется?

Это изменение позволит библиотекам Material и Cupertino внедрять инновации и выпускать обновления чаще, независимо от квартального цикла выпуска Flutter. Кроме того, оно позволит сообществу вносить более непосредственный вклад в разработку библиотек пользовательского интерфейса, которые они используют ежедневно. Для основного фреймворка это изменение приведет к созданию более целенаправленной и стабильной основы.

Что это значит для вас?

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

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

iOS

Совместимость с iOS 26 и бета-версией Xcode 26

Мы активно работаем над совместимостью Flutter с бета-версиями iOS 26. Пожалуйста, помогите нам, протестировав свои приложения и плагины в последних бета-версиях и сообщив о любых обнаруженных вами проблемах . Вы можете отслеживать наш прогресс и ознакомиться со списком известных проблем в этом проекте на GitHub .

Андроид

Защита конфиденциального контента

На Android теперь можно защитить конфиденциальный пользовательский контент во время демонстрации медиаконтента с помощью SensitiveContentвиджета в приложении Flutter. С API 35 и более поздними версиями этот виджет позволяет скрыть весь экран во время демонстрации экрана и предотвратить кражу данных. Подробнее об этой функции и её использовании см. в статье Защита конфиденциального контента .

Движок

Общие обновления движка

В версии 3.35 основное внимание по-прежнему уделяется улучшению производительности и совместимости Impeller. Также был сделан вклад в адаптацию UISceneDelegateдля iOS и внедрение дополнительных улучшений в инструментарий. Ниже приведены некоторые важные нововведения.

Движок

  • Оптимизация: Время запуска приложения сокращено за счет выполнения инициализации в новом потоке.

Импеллер

  • Оптимизация: Убран MSAA из промежуточных целей.

  • Точность: Удалено сжатие текстур с потерями по умолчанию.

  • Исправление: Исправлено зависание MaskFilterв последующих розыгрышах.

  • Оптимизация: Рендеринг пути.

  • Новое: добавлена поддержка Vivante GPU.

  • Оптимизация: DrawImageNineтеперь используйте быстрые смеси Porter Duff.

  • Исправление: Исправлена утечка памяти в VideoPlayer.

  • Точность: увеличен расчет радиуса размытия для более чистого размытия с большими сигмами.

iOS

  • Исправление: Исправлен сбой в WebViewоболочке ClipRSuperellipse.

  • Исправление: декодирование изображений теперь работает при запуске приложений в фоновом режиме из удаленного уведомления.

  • Возрождение: Возвращена возможность распознавания живого текста (OCR) в текстовые поля.

Андроид

  • Миграция: шаблон проекта перенесен на Android 24.

  • Исправление: Исправлен сбой на устройствах Android <= 14 из-за программ чтения фоновых изображений.

  • Исправление: Исправлены однородные массивы во фрагментных шейдерах для OpenGLES Impeller.

  • Исправление: Исправлены перевернутые проходы фрагментного шейдера в OpenGLES Impeller.

  • Исправление: Исправлен сбой в FlutterEngineGroup.

macOS

  • Исправление: Исправлено отображение цветов P3.

DevTools и IDE

Сервер Dart and Flutter MCP теперь находится в стабильной версии

Экспериментальный сервер Dart and Flutter MCP теперь доступен в стабильной версии Dart SDK. Это важный шаг на пути к достижению нашей цели — высокопродуктивного процесса разработки с использованием искусственного интеллекта для каждого разработчика Dart и Flutter.

Расширенный контекст Dart и Flutter для помощников по кодированию на основе ИИ

Сервер Dart and Flutter MCP выступает в роли моста, предоставляя помощникам по программированию на базе ИИ доступ к ещё более широкому контексту вашего проекта через набор инструментов Dart and Flutter. Теперь ваш помощник на базе ИИ не просто предлагает варианты кода, но и способен глубоко понимать ваш проект и принимать решения от вашего имени. Это позволяет вам сосредоточиться на своих целях, пока ИИ управляет механикой.

С помощью сервера Dart and Flutter MCP вы можете поручить своему помощнику на основе искусственного интеллекта:

  • Исправление ошибок времени выполнения : проверка дерева виджетов в реальном времени, выявление переполнения Flutter RenderFlex и автоматическое применение правильного исправления.

  • Управление зависимостями : найдите на pub.dev наиболее подходящий пакет для конкретной задачи, добавьте его в свой файл pubspec.yamlи запустите pub get.

  • Напишите и исправьте код : создайте шаблон для новой функции, а затем самостоятельно исправьте любые ошибки анализа, которые возникнут в ходе его реализации.

  • И еще…

Подключитесь к вашим любимым инструментам ИИ

Подключив ваши любимые инструменты ИИ, такие как Gemini Code Assist, Firebase Studio, Gemini CLI, GitHub Copilot и Cursor, к серверу Dart и Flutter MCP, вы сможете выйти на новый уровень производительности.

Полное руководство о возможностях сервера Dart and Flutter MCP и о том, как настроить его в предпочитаемом вами редакторе, можно найти в нашей подробной записи в блоге « Усильте свой опыт разработки на Dart и Flutter с помощью сервера Dart and Flutter MCP» и в документации .

Исправление проблемы с макетом, реализованное с помощью сервера Dart и Flutter MCP (Примечание: для краткости некоторые части этой записи были ускорены.)

Кому интересно вот изображение, в редакторе хабра оно не вставляется ни в какую):

https://miro.medium.com/v2/resize:fit:1400/format:webp/1*3K1rgoDtIBWbIFZPp1VCEQ.gif

Обновления DevTools

Мы продолжаем вносить общие, UX- и производительные обновления в DevTools. Чтобы узнать больше обо всех обновлениях Flutter 3.35, ознакомьтесь с примечаниями к выпуску DevTools 2.46.0 , 2.47.0 и 2.48.0 .

Предварительные версии экспериментальных виджетов уже здесь!

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

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

Эксперименты с темами в предпросмотре виджетов
Эксперименты с темами в предпросмотре виджетов

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

  1. Более тесная интеграция с IDE : мы планируем выйти за рамки текущего отдельного окна браузера и предложить дополнительную встроенную панель предварительного просмотра непосредственно в VS Code, Android Studio и IntelliJ IDEA.

  2. Поддержка общих тем : по мере реализации нашего плана, упомянутого ранее в этой записи блога, по отделению библиотек дизайна Material и Cupertino от базовой платформы, предварительные просмотры виджетов будут развиваться для более эффективной поддержки пользовательских и общих систем дизайна.

Мы невероятно рады предоставить вам эту возможность. Для начала ознакомьтесь с документацией и расскажите нам о своих впечатлениях!

Повышение скорости сервера анализа

Команды командной строки Dart , использующие сервер анализа, теперь запускают снимок сервера анализа, скомпилированный с помощью AOT. К ним относятся dart analyzedart fixи dart language-server.

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

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

Обновления плагинов Android Studio и Jetbrains IDE

С выпуском версии M87 плагина Flutter IntelliJ Plugin появилась поддержка Android Studio Meerkat и Narwhal . В этой версии плагин Flutter теперь можно установить на CLion, GoLand, PyCharm и ряд других IDE JetBrains! Полный список поддерживаемых продуктов см . здесь . Благодарим Алекса Ли ( Flutter and Dart GDE ), чей PR #7949 и плодотворное сотрудничество с нашей командой стали движущей силой расширения числа поддерживаемых плагином IDE JetBrains.

Список всех обновлений и исправлений можно найти здесь . Чтобы получить последнее обновление: Настройки > Плагины > Flutter > Обновление .

Рассмотрите возможность подписаться на канал разработчиков, чтобы тестировать последние обновления по мере их еженедельного выхода. Инструкции можно найти здесь .

Полный набор IDE, поддерживаемых Flutter IntelliJ Plugin версии M87.
Полный набор IDE, поддерживаемых Flutter IntelliJ Plugin версии M87.

Критические изменения и устаревание

В этот выпуск включено несколько важных устаревших функций и критических изменений, которые являются частью наших постоянных усилий по модернизации и улучшению фреймворка Flutter.

  • Нормализация тем компонентов: этот выпуск знаменует собой завершение важного долгосрочного проекта по нормализации тем компонентов. Чтобы сделать темирование более согласованным и соответствующим Material 3, темы компонентов, такие как AppBarThemeBottomAppBarTheme, и , InputDecorationThemeбыли переработаны и теперь основаны на новых …ThemeDataклассах, ориентированных на данные.

  • Редизайн виджета радиокнопок: Виджеты RadioCupertinoRadioи RadioListTileбыли переработаны для улучшения доступности. Свойства groupValueи onChangedустарели в пользу нового RadioGroupвиджета, который управляет состоянием набора радиокнопок.

  • Виджет формы и отрезки: Виджет Formбольше не может использоваться напрямую как отрезок. Чтобы включить Formв CustomScrollView, его необходимо обернуть в SliverToBoxAdapter.

  • Повышение семантики и удаление толщины: свойства elevationи thicknessбыли удалены из SemanticsConfiguration и SemanticsNode . Эти свойства не были имплементированы, и их удаление упрощает API.

  • Устаревание значения DropdownButtonFormField: параметр valueв DropdownButtonFormFieldустарел и переименован в  initialValueчтобы более точно отражать его поведение.

Более подробную информацию и рекомендации по переходу см. на нашей странице критических изменений .

Устаревшая 32-битная архитектура x86 на Android

Flutter объявил устаревшей 32-битную архитектуру x86 для Android. Для большинства разработчиков это не повлияет, поскольку затронет в основном старые эмуляторы Android на базе x86 и небольшое количество физических устройств. 32-битные эмуляторы и устройства ARM и 64-битные эмуляторы и устройства x86_64 по-прежнему поддерживаются. Полное техническое описание доступно на странице Dart GitHub deprecation issue .

Устаревшая поддержка IDE для старых Flutter SDK

В этом выпуске мы прекращаем поддержку IDE для Flutter SDK до версии 3.13.

В нашем следующем стабильном выпуске версии Flutter SDK до 3.16 будут объявлены устаревшими.

Чтобы узнать больше о политике устаревания Flutter, посетите страницу совместимости с Flutter . Чтобы узнать больше о политике устаревания IDE, посетите страницу поддержки SDK для инструментов разработчика Flutter .

Если вы являетесь пользователем старой версии Dart или Flutter SDK, которая больше не поддерживается, обязательно загрузите совместимую версию .

Минимальный Android SDK изменился

Минимальная версия Android SDK, поддерживаемая Flutter, предоставленная flutter.minSdkVersion, теперь составляет API 24 (Android 7). Если вы изменили это значение на другое, flutter.minSdkVersionвам необходимо увеличить его как минимум до 24.

Кроме того, минимальные требуемые значения Flutter для некоторых специфичных для Android зависимостей были увеличены. Инструмент Flutter сообщит вам, если потребуется увеличить какое-либо из этих значений, а также предоставит инструкции по обновлению (если инструмент не выводит никаких предупреждений, никаких действий не требуется).

Теперь у вас должно быть как минимум:

  • Версия Gradle: 8.7.0

  • Плагин Android Gradle (AGP): 8.6.0

  • Java: 17

Чтобы устранить проблемы AGP и Gradle, запустите AGP Upgrade Assistant в Android Studio или запустите его из командной строки .

Устаревание pluginClass: нет

Поддержка файлов pluginClass: noneплагинов pubspec.yamlбудет прекращена в будущих версиях Flutter, и любой плагин, использующий это поле, должен удалить его для обеспечения совместимости с будущими версиями. Все последние версии Flutter поддерживают отсутствие pluginClass:записи при отсутствии нативного кода для этой платформы.

Заключение

Flutter 3.35 — это результат коллективных усилий по созданию лучшего опыта разработки для всех. Мы благодарны за вклад и отзывы нашего сообщества, включая такие команды, как Canonical, которые помогли воплотить в жизнь такие функции, как горячая перезагрузка веб-страниц и предварительный просмотр виджетов. Ваша страсть движет Flutter вперёд, и мы с нетерпением ждём возможности увидеть, какие удивительные вещи вы создадите с помощью этих новых инструментов.

Полный список всех изменений смотрите в подробных заметках к выпуску и журнале изменений. Чтобы начать работу со всеми функциями Flutter 3.35, выполните команду: flutter upgrade.Нам не терпится увидеть, что вы создадите!

Комментарии (0)