Вышел Flutter 3.47, а вместе с ним — несколько потрясающих обновлений.
Сегодня мы рады представить релиз 1.0 независимых пакетов material_ui и cupertino_ui. Это важный рубеж, который отделяет дизайн-системы от основного SDK.
Мы также повышаем производительность и улучшаем инструменты во всех направлениях. В этом релизе Impeller для настольных ПК включен по умолчанию, наши пайплайны подготовлены для iOS, macOS и Xcode 27, а Flutter Widget Previews перешел в статус стабильной функции.
Итак, выполните команду flutter upgrade в терминале, чтобы начать работу, или читайте дальше, чтобы узнать больше об основных изменениях в этом выпуске.
Выберите свое собственное приключение с интерфейсом
Сделан первый шаг к независимому Flutter: Material и Cupertino теперь доступны в виде автономных пакетов!
Одно из главных достоинств Flutter — способность отрисовывать безупречные виджеты Material и Cupertino. Однако, поскольку исторически эти библиотеки дизайна были встроены прямо в основной SDK, это замедляло их разработку и затрудняло внесение вклада или поддержание их в актуальном состоянии.
Хотя в этом релизе основной SDK по-прежнему включает эти библиотеки, теперь вы можете подключить автономные пакеты material_ui и cupertino_ui, которые официально достигли версии 1.0 на pub.dev.
Разделение дорожных карт дизайна (по выбору)
Подключив независимые дизайн-системы, вы получаете контроль над развитием своего дизайна. Поскольку material_ui и cupertino_ui теперь размещаются на pub.dev, они могут выпускать исправления ошибок и новые компоненты по собственному еженедельному графику, независимо от квартальных релизов Flutter SDK.
Отделение дизайн-систем дает нам следующие преимущества:
- Вы можете использовать самые свежие стили виджетов Cupertino и Material, не принуждая себя к обновлению всей версии Flutter SDK.
- Мы можем внедрять сторонний вклад (contributions) и обновления быстрее и чаще.
- Мы закладываем основу для стиле-независимого каталога базовых виджетов Flutter, что в будущем облегчит создание пользовательских дизайн-систем.
Как выполнить миграцию
Чтобы перенести свой проект на новые автономные пакеты, выполните следующую команду:
bash
Этот инструмент автоматически обновляет ваши импорты с package:flutter/material.dart и package:flutter/cupertino.dart на новые автономные пакеты.
Примечание: Если инструмент миграции столкнется с проблемами при обновлении вашего файла pubspec.yaml (известная ранняя ошибка), вы можете решить ее, вручную выполнив команду flutter pub add material_ui (а также cupertino_ui, если вы ее используете), а затем снова запустив dart fix --apply.
Примечание: Если инструмент миграции столкнется с проблемами при обновлении вашего файла pubspec.yaml (известная ранняя ошибка), вы можете решить ее, вручную выполнив команду flutter pub add material_ui (а также cupertino_ui, если вы ее используете), а затем снова запустив dart fix --apply.
Оригинальные библиотеки дизайна внутри основного SDK запланированы к официальному устареванию в предстоящем осеннем стабильном релизе в ноябре. Если вы мигрируете пакет в экосистеме, относитесь к этому переходу на автономные пакеты как к мажорному релизу.
Сглаживание трудностей миграции
Чтобы облегчить переход экосистемы на новые автономные библиотеки дизайна, material_ui и cupertino_ui поставляются со вспомогательными утилитами миграции. Материал MaterialUiCompatibilityBridge позволяет вашему приложению немедленно перейти на автономные пакеты, даже если некоторые зависимости ваших пакетов все еще используют устаревшие импорты из основного SDK.
Например, вы можете обернуть свое приложение в мост совместимости:
dart
Независимая локализация
В рамках этого перехода пакет flutter_localizations также был вынесен отдельно. Делегаты локализации и переведенные строки для виджетов Material и Cupertino теперь находятся соответственно в пакетах material_ui и cupertino_ui.
До:
dart
После:
dart
Установка localizationsDelegates в GlobalMaterialLocalizations.delegates теперь автоматически включает делегаты Cupertino и виджетов, что упрощает настройку.
Открыто для вклада сообщества
Заморозив вклады в библиотеки Material и Cupertino еще в апреле, мы смогли обеспечить плавную миграцию. Библиотеки, которые ждут вас в material_ui и cupertino_ui — это те же самые библиотеки, которыми вы уже пользуетесь.
Теперь, когда мы готовы снять заморозку, ожидайте регулярного появления новых исправлений и функций в новых пакетах: в настоящее время релизы планируется выпускать еженедельно. Мы также рады официально открыть эти пакеты для вклада со стороны сообщества.
Подготовка к следующей волне обновлений Apple
В связи с выходом Xcode 27, iOS 27 и macOS 27 этой осенью мы уделили особое внимание тому, чтобы Flutter был готов к предстоящим обновлениям. Чтобы ваши пользователи не столкнулись с сюрпризами в первый же день, мы рекомендуем протестировать ваши приложения на текущих бета-версиях Apple.
Кроме того, для поддержки Xcode 27 были повышены минимально поддерживаемые версии ОС:
Требование к жизненному циклу UIScene
SDK iOS 27 теперь требует обязательного использования жизненного цикла UIScene для всех приложений на базе UIKit. Приложения, собранные с Xcode 27 и не использующие UIScene, не смогут запуститься при старте.
Для большинства приложений интерфейс командной строки (CLI) Flutter обрабатывает эту миграцию автоматически во время сборки. Тем не менее, ручная миграция требуется, если у вас есть собственный нативный код в AppDelegate или вы используете плагины, которые все еще полагаются на устаревший жизненный цикл приложения. В таких случаях вы должны выполнить миграцию вручную, следуя руководству по внедрению UIScene/Delegate.
Постепенный отказ от компьютеров Mac на базе процессоров Intel
В соответствии с переходом Apple на процессоры Apple Silicon, Flutter сворачивает поддержку Mac на базе Intel. Мы отключили автоматический запуск тестов на оборудовании Intel, и CLI Flutter теперь выводит предупреждения при сборке на хостах Intel или при таргетинге на две архитектуры. В будущих релизах эти предупреждения станут ошибками.
Вы можете сразу включить сборку приложений для macOS только под архитектуру ARM64, выполнив команду flutter config --enable-macos-arm64-only.
Прогресс в поддержке Swift Package Manager
Сообщество добилось невероятных успехов в переходе на Swift Package Manager: уже 100 лучших плагинов для iOS мигрировали на него на 92%. Если ранее вы отключали Swift Package Manager, вы можете попробовать включить его снова, выполнив команду flutter config --enable-swift-package-manager.
Поскольку CocoaPods теперь находится в режиме обслуживания, плагины, не перешедшие на SwiftPM, со временем перестанут работать. Немигрировавшие плагины также получают более низкие оценки на pub.dev. Если вы поддерживаете плагин, обратитесь к руководству по миграции и прочитайте наш предыдущий пост в блоге для получения подробной информации.
Этот релиз также отличается оптимизированным временем сборки благодаря контрибьютору сообщества @lukemmtt, который улучшил пайплайны сборки путем ранней фильтрации ненужных схем пакетов SwiftPM в процессе сборки (#186006).
Взятие курса на Wasm по умолчанию
Мы активно работаем над тем, чтобы сделать WebAssembly (Wasm) стандартом по умолчанию для веб-приложений на Flutter, что обеспечит производительность близкую к нативной в браузере. Если вы еще не тестировали свои веб-приложения с Wasm, вы можете подключить его уже сегодня, передав флаг --wasm в команду сборки релиза:
bash
Готовясь к этому переходу, помните, что Wasm требует миграции вашей кодовой базы на новый пакет межъязыкового взаимодействия с JS (package:web), поскольку устаревшая библиотека dart:html не поддерживается. Обновление зависимостей пакетов вашего проекта часто автоматически решает эти проблемы со старым межъязыковым взаимодействием.
Чтобы помочь в масштабировании крупных веб-приложений, этот релиз также добавляет экспериментальную поддержку отложенной загрузки в Wasm. Доступная под флагом на основном канале, она позволяет разбивать ваше Wasm-приложение на более мелкие модули с ленивой загрузкой, оптимизируя время первоначальной загрузки:
bash
Современная графика на десктопе благодаря Impeller
Мы стремимся сделать десктопные платформы первоклассными целями для высокопроизводительной графики. В Flutter 3.47 Impeller становится средством рендеринга по умолчанию для macOS, Windows и Linux.
Если вы еще не знакомы с Impeller, это графический движок Flutter нового поколения, созданный с нуля на замену Skia. Ориентируясь на современные аппаратные API (такие как Metal на macOS и Vulkan на Windows и Linux), Impeller компилирует фиксированный набор шейдеров на этапе сборки, а не динамически во время выполнения. Это устраняет кратковременные подтормаживания, называемые рывками компиляции шейдеров, при первом воспроизведении анимации, обеспечивая стабильно плавные переходы с самого первого кадра. Узнайте больше в документации по графическому движку Impeller.
Если вам нужно временно отказаться от использования Impeller, выполните следующие действия:
- macOS: Установите FLTEnableImpeller в значение false в файле Info.plist.
- Windows: Добавьте project.set_impeller_switch(flutter::ImpellerSwitch::Disabled) в файл main.cpp.
- Linux: Вызовите fl_dart_project_set_enable_impeller(project, FALSE) в файле my_application.cc.
Резервные варианты будут удалены в одном из будущих релизов, поэтому отправляйте отчеты об ошибках, если вам обязательно нужно вернуться к использованию Skia. Кроме того, расширенный цветовой охват (Wide Gamut Color) теперь активен по умолчанию на macOS, обеспечивая насыщенный, яркий и точный рендеринг цветов на поддерживаемом оборудовании.
Экспериментальный прогресс в работе с несколькими окнами
В партнерстве с Canonical и благодаря мейнтейнерам @robert-ancell и @mattkae, мы расширяем наши экспериментальные API для работы с окнами на десктопе. Linux и Windows теперь поддерживают всплывающие окна (#185866, #184516), позволяя создавать нативные контекстные меню и вспомогательные палитры.
Теперь вы также можете запросить windowHandle в специфичных для платформы контроллерах, чтобы получить прямой указатель на нижележащее нативное окно (HWND, NSWindow или GtkWindow). Это открывает доступ к продвинутым нативным функциям, таким как стыкуемые панели в Windows, пример создания которых был предоставлен @orestesgaolin:
Мы также устранили несколько ошибок, связанных с фокусом и созданием окон. В Windows активация окна больше не перемещает фоновые окна на передний план и не перехватывает фокус обратно при возобновлении работы приложения, благодаря контрибьютору @9AZX (#188016):
В Linux создание нескольких окон теперь явно инициализирует окна до того, как они получат первый кадр от композитора, что исправляет ранние предупреждения рендеринга и утверждения композитора.
Мы также добавили новый API для подгонки размеров под содержимое, который позволяет создавать обычные окна и диалоговые окна с автоматическим изменением размера под их контент.
Варианты сборки (Flavors) для десктопа
Windows и Linux теперь поддерживают flavors во Flutter.
Например, в вашем файле pubspec.yaml можно использовать разные ассеты для разных flavors:
yaml
Используйте опцию --flavor для указания вашего варианта сборки. Например:
- flutter build windows --flavor flavor_a
- flutter build linux --flavor flavor_a
Спасибо @AngeloAvv за прекрасный вклад (#187034, #187029)!
Более четкий текст на десктопе
Десктопные экраны часто имеют меньшую плотность пикселей по сравнению с мобильными дисплеями, но обладают большей вычислительной мощностью графики. Для достижения более четкого текста и чистых векторных кривых на десктопе движок Flutter с использованием Impeller теперь применяет рендеринг на основе Signed Distance Function (SDF) на macOS, Linux и Windows.
Стабильные превью и обновления для GenUI
Предпросмотр виджетов стал стабильным
Функция предварительного просмотра виджетов Flutter Widget Preview теперь стабильна, что позволяет мгновенно рендерить, проверять и итеративно изменять отдельные компоненты пользовательского интерфейса без сборки или запуска всего приложения.
С этим стабильным релизом вы можете рассчитывать на:
- Более быстрое время запуска благодаря локальному кэшированию проекта в папке .widget_preview/, что устраняет накладные расходы на повторную настройку.
- Более гибкое тестирование с абстрактным API PreviewThemeData, поддерживающим последовательное наложение тем для сложных матричных тестов.
- Автоматическую синхронизацию веб-ассектов при предварительном просмотре веб-виджетов: ассеты web/ вашего хост-проекта копируются напрямую, автоматически применяя любые пользовательские темы или настраивая ваш файл index.html при использовании Flutter web.
Дальнейшие достижения в GenUI
Экосистема Flutter продолжает развиваться, чтобы удовлетворять потребности разработчиков, использующих GenUI для создания новых типов агентских интерфейсов для пользователей. Недавно был выпущен пакет genui версии 0.10.0, принесший множество исправлений и новых функций, среди которых:
- Новый пакет a2ui_core, который объединяет классы, связанные с протоколом, включая такие вещи, как выражения, элементы каталога и многое другое.
- Поддержка клиентских функций A2UI, которые позволяют предоставлять агенту функции, направляющие клиента на выполнение валидации, вычисляемых значений и других небольших задач без лишних сетевых запросов.
Улучшение работы с платформами
В этом разделе описаны целевые улучшения, внесенные сообществом и командой Flutter для повышения удобства работы разработчиков и пользователей на всех платформах.
Android
На Android мы исправили проблему с виртуальной клавиатурой, из-за которой клавиши-модификаторы (например, Shift) могли залипать во время событий. Обработчик клавиш теперь пропускает синтез физических клавиш для вводов с виртуальной клавиатуры, поддерживая чистоту взаимодействий с клавиатурой.
Матрица зависимостей Android
Для обеспечения стабильныхборок Flutter 3.47 проверен со следующими версиями зависимостей Android:
- Java: 17 (минимальная требуемая версия)
- Kotlin Gradle Plugin (KGP): 2.4.0
- Android Gradle Plugin (AGP): 9.1.0 (самая новая совместимая с KGP 2.4.0)
- Gradle: 9.3.1 (минимальная требуемая для AGP 9.1.0)
Чтобы гарантировать успешную сборку вашего приложения в будущих релизах, мы рекомендуем использовать стандартные переменные уровня API, предоставляемые SDK Flutter в ваших файлах сборки. Для этого релиза они настроены со следующими значениями по умолчанию:
- flutter.compileSdkVersion (API 36)
- flutter.targetSdkVersion (API 36)
- flutter.minSdkVersion (API 24)
iOS и macOS
Для разработчиков iOS подписание кода стало более прозрачным. Благодаря участнику сообщества @alex-medinsh, интерфейс командной строки (CLI) отображает как ID команды, так и ее название при выборе сертификата (#184665).
Кроме того, участник сообщества @mozammal-hossain улучшил диагностику проблем, предоставив более понятные сообщения об ошибках профиля подготовки при сбое подписания (#184051).
Десктоп
Десктопные платформы также получили адресные доработки. Позиционирование каретки при вводе текста на корейском языке исправлено на Windows (благодаря @CHOIgoung, #186353), а плагины для Windows теперь могут переносить ресурсоемкие задачи с потока платформы с помощью FlutterEngine::PostPlatformThreadTask. На Linux @CodeDoctorDE добавил передачу данных о вращении стилуса и силе нажатия (#186831).
Графика и движок
В движке фрагментные шейдеры, ориентированные на OpenGLES, больше не требуют условного зеркального отражения координат при чтении текстур. Теперь это обрабатывается в вершинном шейдере. Дополнительную информацию см. на странице критических изменений рендеринга в текстуру OpenGLES.
Доработки фреймворка
Наконец, сам фреймворк стал плавнее благодаря улучшениям, распределенным по ключевым компонентам:
Доступность и семантика: параметры высокой контрастности и инверсии цветов Android теперь определяются автоматически благодаря @xxxOVALxxx (MediaQueryData.highContrast и MediaQueryData.invertColors, #182263). Вложенные текстовые диапазоны внутри Text.rich теперь соответствуют последовательности их компоновки в дереве семантики, а также добавлена блокировка фокуса клавиатуры для BlockSemantics.
Текст и выделение: маркеры выделения текста на мобильных устройствах теперь остаются стабильными при незначительной прокрутке, а сочетания клавиш теперь могут закрывать открытые меню выделения. На Android маркеры выделения больше не загораживают контекстное меню при размещении у верхней границы экрана благодаря @JhonaCodes (#182663).
Мы также устранили сбой в SelectableRegion, возникавший при начале выделения в пустом прокручиваемом контейнере, и исправили артефакты визуального выделения на затухающем выделяемом тексте благодаря @ikramhasan (#183628).
Жесты и прокрутка: улучшено распространение жестов для нативных представлений iOS, встроенных через платформенные представления. EdgeDraggingAutoScroller теперь учитывает ScrollPhysics активного представления прокрутки, предотвращая автопрокрутку в заблокированных списках.
Улучшения базовых виджетов: сохранение исходных цветов в ImageIcon с помощью useOriginalColors: true (#180491), указание поведения обрезки в AnimatedCrossFade (#184545) и прямая отслеживание ошибок потока изображений с помощью ImageStreamListener.
Готовы к обновлению
Все элементы на своих местах, а фундамент готов. Осталось только перенести эти обновления на ваш локальный компьютер:
bash
Пока ваш SDK обновляется в фоновом режиме, у нас есть для вас домашнее задание (но интересное):
- Познакомьтесь с участниками: возьмите попкорн и посмотрите нашу новую видеосерию «Знакомство: заметные коммиты Flutter», посвященную участникам сообщества, которые сделали этот выпуск возможным.
- Ознакомьтесь с подробностями: просмотрите страницу критических изменений (Breaking Changes), чтобы подготовиться к миграции автономных пакетов пользовательского интерфейса.
Мы с нетерпением ждем возможности увидеть, что вы создадите с помощью этой новой и улучшенной версии Flutter!









