Сегодня мы с радостью объявляем о выпуске Flutter 3.41, что знаменует собой важную веху на нашем совместном пути! Это захватывающее время для разработчиков; этот релиз отражает наше стремление расширить возможности нашего сообщества в формировании направления развития Flutter. Благодаря 868 коммитам от 145 уникальных участников, Flutter 3.41 обеспечивает дополнительную прозрачность и модульность, что еще больше улучшает опыт внесения вклада в Flutter.

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

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

Курочка выключает свет и представляет нам новую версию 3.41 (простите за гоблинский стиль)
Курочка выключает свет и представляет нам новую версию 3.41 (простите за гоблинский стиль)

Структурная прозрачность и модульность

Публичные окна релизов

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

Что такое крайний срок для веток (branch cutoff date)? Это крайний срок для принятия запросов на слияние (pull requests) в основные ветки ( mainдля Dart и masterFlutter), чтобы гарантировать их включение в следующий стабильный релиз. Если ваш запрос на слияние будет принят до крайнего срока, он будет включен в следующую стабильную версию. Если после, он будет ожидать следующего цикла.

В 2026 году мы планируем выпустить четыре стабильных релиза (включая этот), даты следующие:

  • Flutter 3.41 — февраль | Ветка создана 6 января

  • Flutter 3.44 — май | Ветка на 7 апреля

  • Flutter 3.47 — август | Ветвление 7 июля

  • Flutter 3.50 — Ноябрь | Ветвление 6 октября

Разделение на отдельные пакеты ради более лёгкого ядра

Мы продолжаем наш проект по переносу библиотек Material и Cupertino в отдельные пакеты. Такой модульный подход имеет ряд преимуществ:

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

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

  • Адаптивный дизайн: Версионированные пакеты позволяют нам гораздо быстрее реагировать на кардинальные изменения дизайна в iOS или Android, такие как «Liquid Glass» или «Material 3 Expressive», гарантируя, что ваше приложение никогда не будет выглядеть устаревшим.

Следите за обсуждением на GitHub , чтобы отслеживать ход выполнения.

Поддержка стандартов экосистемы

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

Swift Package Manager и UIScene

Переход от CocoaPods к Swift Package Manager продолжается. Мы настоятельно рекомендуем авторам плагинов использовать Swift Package Manager, поскольку он теперь является стандартом для экосистемы Apple. Кроме того, для обеспечения совместимости с будущими версиями iOS, Flutter теперь полностью поддерживает жизненный цикл UIScene по умолчанию . Это обновление и��еет решающее значение для выполнения требований Apple к будущим версиям iOS. Чтобы упростить миграцию с устаревшей логики жизненного цикла AppDelegate, ознакомьтесь с нашим руководством по миграции .

Android Gradle Plugin (AGP) 9 и Kotlin DSL

Мы продолжаем соответствовать современным стандартам Android. С выпуском Android Gradle Plugin (AGP) 9 мы работаем над поддержкой новых требований к строгости стандартов и предоставляем рекомендации по их выполнению.

Внимание: Не обновляйте ваше приложение Flutter для Android до AGP 9, поскольку миграция плагинов на AGP 9 и приложений Flutter на AGP 9 с использованием плагинов пока не поддерживается ( #181383) . Поддержка приостановлена, пока команда Flutter проверяет миграцию на обратную совместимость со старыми версиями AGP. Данный документ по миграции будет обновляться по мере изменения рекомендаций.

Благодаря вкладу участника сообщества Бёнчана Ли (bc-lee@) , новые проекты плагинов теперь по умолчанию используют Kotlin DSL для Gradle.

Ресурсы, специфичные для платформы

Оптимизация стала проще благодаря работе Алекса Фрея (hm21@) . Теперь вы можете указать, для каких платформ следует включать тот или иной ресурс в сборку в файле pubspec.yaml. Это позволяет проводить такие оптимизации, как исключение ресурсоемких компонентов для настольных компьютеров из мобильных сборок, что значительно уменьшает размер приложения.

flutter:
  assets:
    - path: assets/logo.png
    - path: assets/web_worker.js
      platforms: [web]
    - path: assets/desktop_icon.png
      platforms: [windows, linux, macos]

Прислушиваясь к мнению сообщества

Команда Flutter в Google продолжает уделять первостепенное внимание тому, что наиболее важно для вас.

Начало работы

Команда Flutter в Google выпустила обучающий курс
Команда Flutter в Google выпустила обучающий курс

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

Недавно мы запустили полностью переработанный Курс для начинающих пользователей Dart и Flutter .

Это новый учебный курс, разработанный для того, чтобы познакомить вас с основами создания приложений с использованием Flutter и Dart. Давайте кратко рассмотрим некоторые изменения:

  • Мы представили новое руководство по «быстрой установке», использующее функцию «горячей перезагрузки» в веб-браузере, позволяющее быстро освоить все возможности Flutter без предварительной настройки среды, специфичной для платформы. Руководство включает в себя письменные уроки, простые тесты и восемь новых видеороликов с участием знакомых лиц из команды Flutter в Google.

  • По завершении обучения слушатели должны будут создать с нуля 4 приложения.

Попробуйте новый раздел «Начало работы» в обновленном разделе «Обучение» на нашем сайте, работающем на платформе Jaspr .

Улучшения фрагментных шейдеров

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

  • В версии 3.41 мы добавили синхронное декодирование изображений. Ранее создание текстур для шейдеров могло вызывать задержку в одном кадре. decodeImageFromPixelsSyncТеперь вы можете генерировать текстуры и использовать их в качестве сэмплеров в том же кадре.

  • Мы также добавили поддержку текстур с высоким битрейтом (до 128-битных чисел с плавающей запятой), что открывает возможность использования таблиц поиска (LUT) высокого разрешения для фотофильтров и SDF-файлов с ускорением на графическом процессоре.

void attachTexture(ui.FragmentShader shader) {
  ui.PictureRecorder recorder = ui.PictureRecorder();
  Canvas canvas = Canvas(recorder);
  canvas.drawCircle(const Offset(64, 64), 64, Paint()..color = Colors.red);
  ui.Picture picture = recorder.endRecording();
  ui.Image image = picture.toImageSync(
    128,
    128,
    targetFormat: ui.TargetPixelFormat.rFloat32,
  );
  shader.setImageSampler(0, image);
}

Предварительный просмотр виджетов (экспериментальная функция)

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

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

Предварительный просмотр виджетов
Предварительный просмотр виджетов
  • Поддержка приложений с dart:ffiзависимостями: Ранее предварительные просмотры, включавшие виджеты с транзитивными зависимостями от импортируемых библиотек, dart:ffiвызывали ошибки компиляции и препятствовали обновлению среды предварительного просмотра. Это происходило из-за того, что dart:ffiне поддерживается на веб-платформах ( flutter/flutter#166431 ). Теперь средство предварительного просмотра виджетов может обрабатывать предварительные просмотры, имеющие зависимости от платформенно-специфических библиотек, включая dart:ffiи dart:ioВажное замечание : вызов API из этих библиотек не поддерживается в средстве предварительного просмотра виджетов и приведет к отображению ошибки для предварительных просмотров, вызывающих эти платформенно-специфические API. См. документацию Dart по условному импорту для примеров того, как писать код, совместимый как с нативными, так и с веб-платформами.

Платформенная точность и доводка

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

Полировка iOS

В Flutter 3.41 мы внесли визуальные улучшения в новый стиль «ограниченного размытия». Ранее полупрозрачные виджеты, использующие этот стиль, BackdropFilterмогли страдать от цветового растекания по краям. Благодаря улучшениям в механизме рендеринга Impeller, мы устранили этот артефакт.

До
До
После
После

Мы также добавили поддержку обработки перетаскиванием в нативном стиле для CupertinoSheet showDragHandleсвойства.

CupertinoSheet showDragHandle
CupertinoSheet showDragHandle

Добавить в приложение

Теперь добавлять представления Flutter в существующие приложения Android и iOS стало проще! Представления Flutter, встроенные в существующие нативные приложения, теперь могут автоматически изменять свой размер в зависимости от содержимого. Ранее для представления Flutter требовался фиксированный размер, задаваемый его родительским элементом в нативном приложении. Это создавало сложности в некоторых сценариях, например, при добавлении представлений Flutter в нативное прокручиваемое представление.

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

Чтобы включить это поведение на iOS, установите FlutterViewController.isAutoResizableзначение true . Для Android включите изменение размера контента в вашем Android Manifest и установите ширину или высоту вашего FlutterView в значение content_wrap.

До
До
После
После

Навигация и прокрутка

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

  • Мы внедрили функцию Navigator.popUntilWithResult, позволяющую закрыть (pop) несколько экранов и вернуть значение в целевой маршрут одним вызовом, что значительно упрощает управление состоянием в многоэтапных процессах.

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

Для хабра это гиф слишком большой, ни в какую не хочет, вот анимация: https://miro.medium.com/v2/resize:fit:1076/format:webp/1*klfeLTPZihrgBRUmUzWaIA.gif
Для хабра это гиф слишком большой, ни в какую не хочет, вот анимация: https://miro.medium.com/v2/resize:fit:1076/format:webp/1*klfeLTPZihrgBRUmUzWaIA.gif
  • Мы исправили проблему с закрепленными заголовками в NestedScrollViewи SliverMainAxisGroup, обеспечив корректное перекрытие заголовков последующими фрагментами кода.

Доступность

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

  • Встроенная поддержка специальных возможностей для CircularProgressIndicatorи LinearProgressIndicator, позволяющая вспомогательным технологиям сообщать об обновлениях в процессе работы.

  • Теперь Flutter учитывает настройки межстрочного интервала, заданные пользователями веб-сайта, для улучшения удобства чтения.

  • В flutter_test мы добавили новые сопоставители, такие как isSemanticsи , accessibilityAnnouncementчтобы упростить проверку доступности.

Материалы и анимация

Мы добавили новые примитивы и свойства для расширения возможностей управления анимацией и компоновкой. Благодаря работе участника сообщества Бернардо Феррари (bernaferrari@) появился RepeatingAnimationBuilderдекларативный способ создания непрерывных анимаций, таких как индикатор загрузки, пульсирующая кнопка или мерцающий эффект заполнителя.

Например, вот как можно заставить квадратное поле скользить вперед и назад:

RepeatingAnimationBuilder<Offset>(
  animatable: Tween<Offset>(
    begin: const Offset(-1.0, 0.0), 
    end: const Offset(1.0, 0.0),
  ),
  duration: const Duration(seconds: 1),
  repeatMode: RepeatMode.reverse,
  curve: Curves.easeInOut,
  builder: (BuildContext context, Offset offset, Widget child) {
    return FractionalTranslation(
      translation: offset,
      child: child,
    );
  },
  child: const ColoredBox(
    color: Colors.green,
    child: SizedBox.square(dimension: 100),
  ),
),

Мы также обновили CarouselViewконструктор .builder, упростив создание каруселей с динамическим контентом. DropdownMenuFormFieldТеперь поддерживается пользовательский стиль errorBuilder, а RawAutoсompleteтакже добавлена OptionsViewOpenDirection.mostSpace​​возможность интеллектуального позиционирования элементов в зависимости от доступного пространства экрана.

Эволюция, инициированная сообществом

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

Благодаря лидерству инженеров Canonical, мы устраняем пробел в сложных требованиях к пользовательскому интерфейсу настольных приложений. В этом релизе представлены экспериментальные API для создания всплывающих окон и окон с подсказками, а также кроссплатформенная поддержка диалоговых окон в Linux, macOS и Windows. Наконец, добавлены новые API для тестирования многооконных приложений. Если вы хотите ознакомиться с этими будущими API для работы с окнами, посмотрите пример приложения multiple_windows в Flutter !

В Flutter Linux теперь по умолчанию включено объединение потоков, что упрощает модель многопоточности и повышает производительность, а также способствует улучшению стабильности в Windows. Мы планируем убрать возможность отключать merged threads (opt-out) в одном из будущих релизов. Если у вас возникнут какие-либо проблемы с объединением потоков, пожалуйста, сообщите нам об этом .

Инструменты разработчика

В инструментах разработчика наблюдаются улучшения в производительности и стабильности:

  • Инструменты разработчика Flutter компилируются с использованием dart2wasm, что приводит к повышению производительности. При желании можно отказаться от dart2wasm-версии и вернуться к dart2js через настройки..

  • Теперь при разрыве соединения с демоном Dart Tooling Daemon (DTD) автоматически предпринимаются повторные попытки подключения для улучшения качества работы после выхода компьютера из спящего режима.

Это лишь несколько основных моментов этого релиза. Чтобы узнать обо всех обновлениях, включенных в Flutter 3.41, ознакомьтесь с примечаниями к релизам DevTools 2.52.0 , 2.53.0 и 2.54.0 .

Следующая остановка: flutter upgrade

Flutter 3.41 — это шаг к улучшению опыта участия в проектах с открытым исходным кодом, а также к совершенствованию базовых функций Flutter для повышения удобства разработки, будь то перенос плагина в Swift Package Manager, оптимизация ресурсов для конкретных платформ или работа с пикселями с помощью новых API шейдеров. Мы благодарны за замечательное сообщество, которое мы создали вместе.

Для получения полного списка всех изменений обязательно ознакомьтесь с подробными изменениями, нарушающими обратную совместимость , и примечаниями к выпуску . Чтобы опробовать новые функции Flutter 3.41, достаточно всего лишь flutter upgrade!