[Перевод] Flutter 3.27 — Что нового во Flutter?
Введение
Давайте погрузимся в Flutter 3.27! Этот релиз полон улучшений и функций, направленных на улучшение вашего опыта разработки и повышение производительности вашего приложения.
У нас есть обновления по всему фреймворку, движку и экосистеме, включая прогресс с Impeller и улучшения виджетов Cupertino. Кроме того, мы представляем захватывающие новые функции в DevTools, которые делают управление вашими проектами Flutter проще, чем когда-либо. С более чем 1400 коммитами от 187 участников (включая 49 участников, которые внесли свой вклад впервые !), Flutter 3.27 является свидетельством невероятной энергии и сотрудничества сообщества Flutter. Давайте узнаем, что нового!
Рамки
Обновления Купертино
Этот выпуск включает высококачественные обновления для CupertinoCheckbox
и CupertinoRadio
, в том числе обновления размеров, цветов, ширины штрихов и поведения при нажатии. Также были внесены крупные обновления настраиваемости для CupertinoRadio
, CupertinoCheckbox
и CupertinoSwitch
, в которых были добавлены такие свойства, как курсоры мыши, семантические метки, изображения больших пальцев и цвета заливки. Некоторые свойства, такие как неактивный цвет CupertinoCheckbox
, устарели, а другие, такие как цвет дорожки CupertinoSwitch
, были переименованы. Эти изменения приводят эти виджеты в соответствие с их аналогами из Material.
CupertinoSlidingSegmentedControl
получает некоторые обновления точности радиуса большого пальца, высоты разделителя, отступа, теней и выравнивания масштаба большого пальца. Теперь он также поддерживает отключение отдельных сегментов и пропорциональную компоновку на основе содержимого сегмента.
Благодаря замечательному вкладу члена сообщества @veloce фоны CupertinoNavigationBar
и CupertinoSliverNavigationBar
теперь прозрачны, пока под ними не прокручивается содержимое.
Это позволяет панели навигации иметь тот же цвет, что и ее фон в развернутом состоянии, но другой настраиваемый цвет в свернутом состоянии (и возможность переключения между обоими цветами при прокрутке).
Благодаря замечательному вкладу члена сообщества @kerberjg теперь вы можете применять стили кнопок iOS 15+, используя новое CupertinoButtonSize
перечисление с новым sizeStyle
свойством в CupertinoButton
. Используйте новый CupertinoButton.tinted
конструктор для создания кнопок с полупрозрачным фоном.
CupertinoButton
также имеет новый onLongPress
обработчик и позволяет выполнять действия с помощью сочетаний клавиш.
CupertinoPicker
и CupertinoDatePicker
теперь будет прокручиваться до нажатых элементов.
CupertinoAlertDialog
теперь поддерживает жест нажатия и скольжения.
CupertinoActionSheet
получил ряд обновлений, повышающих точность воспроизведения, включая настройку отступов и во всех настройках размера текста, а также поддержку тактильной обратной связи при скольжении по кнопкам.
Другие изменения включают в себя CupertinoContextMenu
поддержку прокрутки, если действия выходят за пределы экрана, CupertinoDatePicker
отмену обрезки длинного содержимого в столбцах и CupertinoMagnifier
поддержку эффектов масштабирования за счет предоставления шкалы увеличения.
Нормализация тем Material
В этом выпуске CardTheme
, DialogTheme
и TabBarTheme
были переработаны, чтобы соответствовать соглашениям Flutter для тем компонентов. CardThemeData
, DialogThemeData
и TabBarThemeData
были добавлены для определения переопределений для значений по умолчанию визуальных свойств компонента. В будущих выпусках будет продолжена нормализация тем компонентов, подобных этим, для более согласованного опыта тематизации в библиотеке Material.
Дополнительные функции для CarouselView
В этом выпуске представлено CarouselView.weighted
, что позволяет создавать более динамичные макеты в каруселях. Настраивая flexWeights
параметр в конструкторе, можно добиться разнообразных макетов элементов. Например, [3, 2, 1] создает макет с несколькими просмотрами , [7, 1] создает макет героя , а [1, 7, 1] дает центрированный макет героя. Эти значения представляют относительный вес, который каждый элемент занимает в представлении карусели, и могут быть настроены в соответствии с конкретными потребностями пользователей.
Подробнее о разделе «Material»
Этот выпуск включает ряд небольших улучшений функций и исправлений ошибок. Некоторые примеры улучшений:
ButtonStyleButton
В метод styleFrom для классов (ElevatedButton
,FilledButton
,OutlinedButton
,TextButton
,MenuItemButton
, и ) добавлено больше свойств, связанных со значками,SubmenuButton
что обеспечивает большую настраиваемость.
Некоторые примеры исправления ошибок:
Размеры и цвета значков по умолчанию для
ButtonStyleButton
классов соответствуют спецификациям Material 3.Поведение прокрутки AppBar теперь корректно сохраняется при открытии панели навигации, что соответствует собственному опыту Android.
MenuAnchor
дополнительно улучшено за счет исправлений фокуса иDropdownMenu
решения нескольких проблем, включая проблему прокрутки во вложенных прокручиваемых элементах и поведение механизма фильтрации.
Плавное смешивание переходов при роутинге
ModalRoutes теперь более гибкие, когда предыдущие и новые маршруты имеют разные переходы страниц. Когда новый маршрут попадает на экран, иногда им нужно, чтобы предыдущий существующий маршрут воспроизводил определенный переход для синхронизации с входным переходом нового маршрута. Теперь они ModalRoutes
могут предоставлять друг другу конструкторы выходных переходов, чтобы входные и выходные переходы всегда синхронизировались. Это позволяет страницам иметь несколько вариантов перехода маршрута на одной странице с помощью навигатора и маршрутизатора Flutter.
Улучшения выделения текста
Flutter SelectionArea
теперь поддерживает жест Shift + щелчок для перемещения области выделения в позицию щелчка в Linux, macOS и Windows.
Теперь вы также можете очистить выделение в SelectionArea и с помощью SelectableRegion
метода. теперь также доступен путем предоставления ему и доступа к его .clearSelectionSelectableRegionStateSelectableRegionStateSelectionAreaGlobalKeySelectionAreaState.selectableRegion
Мы также решили некоторые проблемы с RenderParagraph, поэтому выделение текста под SelectionArea
или SelectableRegion
по-прежнему работает так, как и ожидалось, после изменения размера окна , а также при щелчке или касании за пределами фактического текста.
Расстояние между строками и столбцами
В этом выпуске также представлено новое удобство использования строк и столбцов — интервал! Этот двойной параметр применит фиксированное количество пикселей для смещения дочерних элементов строк и столбцов друг от друга, что сокращает предыдущий объем кода, необходимый для этого.
Двигатель
Импеллер на Android
Мы рады сообщить, что Impeller теперь является движком рендеринга по умолчанию на современных устройствах Android. Хотя Impeller на этих устройствах находится в стадии предварительной версии с момента выпуска стабильной версии Flutter 3.16 в ноябре 2023 года, с тех пор мы внесли значительные улучшения как в производительность, так и в точность на основе отзывов пользователей.
На старых устройствах Android и устройствах без поддержки Vulkan движок рендеринга Skia будет использоваться по-прежнему. Хотя мы считаем, что производительность и точность Impeller являются высококачественными, пользователи могут отказаться и вернуться к устаревшему рендеру Skia, перейдя --no-enable-impeller
к flutter
инструменту командной строки или поместив следующее в свой AndroidManifest.xml
файл (ы):
В дальнейшем мы продолжим улучшать производительность и точность Impeller на Android. Кроме того, мы намерены подготовить бэкэнд OpenGL Impeller к удалению резервной копии Skia.
Как и в период предварительного просмотра, мы просим разработчиков Flutter обновиться до последней стабильной версии и сообщать о любых недостатках, замеченных при включении Impeller. Обратная связь по-прежнему бесценна для обеспечения успешной работы Impeller на Android. Экосистема оборудования Android гораздо более разнообразна, чем экосистема iOS. По этой причине наиболее полезная обратная связь об Impeller должна включать подробную информацию о конкретном устройстве и версии Android, где возникли проблемы.
Улучшения на устройствах iOS
В предыдущих версиях Flutter пользователи могли столкнуться с проблемой , при которой приложения на устройствах iOS ждали несколько миллисекунд на кадр из-за обратного давления композитора. Это обратное давление наблюдалось как задержки в начале рабочей нагрузки растра. Во многих случаях эта задержка вызывала пропуск кадров и рывки. Этот эффект был особенно заметен на устройствах с высокой частотой кадров и меньшим бюджетом времени кадра.
В этом выпуске участник проекта с открытым исходным кодом @knopp добавил новую реализацию поверхности рендеринга Metal, которая позволяет растровым рабочим нагрузкам начинаться более последовательно после завершения рабочей нагрузки пользовательского интерфейса. Это означает, что пользователи заметят, что общее время кадра стало более стабильным, поскольку меньше ожидания системного компоновщика iOS. В частности, Flutter теперь будет гораздо более стабильно достигать 120 Гц на устройствах с высокой частотой кадров. В наших тестах мы наблюдали это улучшение в значительном сокращении среднего времени растеризации кадра во многих сценариях.
На этой диаграмме показано повсеместное снижение среднего времени растеризации кадра в миллисекундах в большом количестве различных тестов, запущенных на устройствах iPhone 11.
Расширенная цветовая палитра для UI
Flutter теперь поддерживает определение UI с цветами в цветовом пространстве DisplayP3, чтобы в полной мере использовать возможности дисплеев на устройствах iOS. Он также имеет более расширенную битовую глубину для поддержки большего количества цветов в цветовых пространствах sRGB и DisplayP3. Это изменение привело к устареванию некоторых Color
методов; более подробную информацию можно найти в уведомлении об изменениях, влияющих на обратную совместимость .
Web
Улучшения в Web
В этом выпуске реализован ряд улучшений Flutter Web, направленных на производительность, эффективность и доступность:
Декодирование изображений в Safari и Firefox теперь выполняется с использованием
элемента вместо кодеков WebAssembly для всех статических изображений. Это устраняет помехи, связанные с декодированием изображений, и снижает использование памяти WASM.
Представления платформы были оптимизированы для сокращения количества наложений холста, что повысило эффективность рендеринга.
Все плагины и пакеты, разработанные командой Flutter, теперь совместимы с WebAssembly.
Были реализованы многочисленные исправления доступности для заголовков, диалоговых окон, паролей, клавиатуры iOS, ссылок и прокручиваемых элементов.
В рендерерах CanvasKit и Skwasm исправлен ряд ошибок рендеринга, включая фильтры изображений, обрезку и использование памяти
Paint
объектами.Улучшена прокрутка перетаскиванием в режиме многооконного просмотра.
iOS
Менеджер пакетов Swift
Flutter переходит на Swift Package Manager. Это дает несколько преимуществ:
1. Доступ к экосистеме пакетов Swift . Плагины Flutter смогут использовать растущую экосистему пакетов Swift !
2. Более простая установка Flutter . Swift Package Manager связан с Xcode. В будущем вам не нужно будет устанавливать Ruby и CocoaPods, чтобы использовать Flutter для платформ Apple.
Ранее поддержка Swift Package Manager была доступна только на «основном» канале Flutter. Мы рады сообщить, что функция Swift Package Manager теперь доступна также на «бета» и «стабильном» каналах! На данный момент функция Swift Package Manager по умолчанию отключена, пока мы устраняем неполадки.
Авторам плагинов рекомендуется добавить поддержку Swift Package Manager в ваши плагины. Многие популярные плагины — включая Firebase , plus plugins и другие — уже перешли на Swift Package Manager!
Pub.dev теперь проверяет плагины на совместимость с Swift Package Manager. В будущем пакеты, которые несовместимы, не будут получать полные оценки пакетов.
Если у вас есть отзыв о поддержке Flutter для Swift Package Manager, пожалуйста, сообщите о проблеме .
Андроид
От края до края (Полноэкранный режим без полей)
По умолчанию на устройствах под управлением Android 15+ ваше приложение будет использовать режим Edge-to-Edge и работать на весь экран! Подробную информацию об изменении и о том, как отказаться от этого поведения, см. в руководстве .
Поддержка Freeform
Android Freeform позволяет пользователям изменять размер окон приложений и доступен как опция разработчика. Flutter SafeArea
и MediaQuery
были обновлены для обработки вырезов оборудования, когда окно свободной формы перемещается в вырез оборудования.
Поддержка скриптов сборки Kotlin и декларативная миграция плагинов
Разработчики теперь могут использовать build.gradle.kts
файлы.
Инструменты Flutter теперь поддерживают файлы сборки Kotlin. Если вы столкнетесь с местом, где мы не поддерживаем Kotlin, пожалуйста, сообщите об ошибке. Groovy остается поддерживаемым языком Gradle.
Flutter 3.27 — последний релиз, который будет поддерживать устаревший метод применения скрипта Gradle. См. документацию по миграции .
Примечание: большинство приложений необходимо будет перенести вручную. Вновь созданные приложения будут использовать файлы сборки Kotlin .
Переход к декларативному включению плагина Flutter Gradle помогает Flutter перейти на файлы сборок Kotlin с лучшей безопасностью типов и более простой поддержкой модульных тестов для кода сборки. Это также часть более широких усилий по повышению стабильности версий инструментов Android.
Экосистема
Экосистемный саммит Flutter and Dart Package USA 2024
В рамках Fluttercon USA 2024 в сентябре мы провели Flutter and Dart Package Ecosystem Summit. Это был наш второй очный саммит, который последовал за саммитом на Fluttercon Europe в июле 2024 года, и первый виртуальный саммит, который мы провели в августе 2023 года. Ознакомьтесь с резюме выводов дискуссионных сессий здесь .
На саммите авторы и специалисты по сопровождению пакетов провели сессии в формате неконференции по следующим темам:
Сессия 1 — Добавление поддержки Swift Package Manager
Сессия 2 — Прошлое, настоящее и будущее Native Interop
Сессия 3 — Модели устойчивого обслуживания упаковки
Мы с нетерпением ждем возможности проводить больше подобных саммитов в сотрудничестве с сообществом.
Количество загрузок пакетов на pub.dev
Мы запустили метрики количества загрузок на pub.dev!
Предоставление более точных показателей популярности на pub.dev долгое время было самой востребованной функцией в системе отслеживания ошибок сайта.
Теперь при просмотре страницы пакета вы увидите 30-дневный счетчик загрузок вместо прежнего «рейтинга популярности».
Кроме того, мы добавили интерактивную спарклайн-диаграмму, показывающую еженедельную активность загрузок с течением времени. Эта диаграмма помогает разработчикам и авторам пакетов выявлять тенденции в использовании пакетов. Например, это может быть индикатором того, что новый релиз вызвал всплеск использования или что пакет набирает или теряет популярность.
Загрузка регистрируется каждый раз, когда пакет загружается с pub.dev. Например, когда вы запускаете flutter pub get
, а пакета еще нет в вашем кэше pub.
Представленные данные о количестве загрузок являются грубыми и отражают использование системами непрерывной интеграции, анализ пакетов, пользователей-клиентов PUB и т. д.
Рабочие места в пабах
Мы запускаем Pub Workspaces с Dart 3.6 для поддержки разработки нескольких связанных пакетов в одном монорепозитории.
Определив корневой pubspec, ссылающийся на другие пакеты в репозитории, запуск pub get в любом месте репозитория приведет к общему разрешению для всех пакетов. Это гарантирует, что все пакеты будут разработаны с согласованным набором зависимостей.
Анализатор также использует общее разрешение, и теперь ему нужно отслеживать только один контекст анализа для всего рабочего пространства, что может привести к значительному сокращению использования памяти при открытии всего репозитория в вашей IDE.
Автоматическая публикация пакетов Flutter из GitHub
Мы расширили рабочий процесс действий Github setup-dart publish, чтобы также разрешить автоматическую публикацию пакетов Flutter на pub.dev, что упрощает внесение вклада в экосистему Pub проверяемым образом.
Запуск плагина Interactive Media Ads
Мы запустили плагин Flutter Interactive Media Ads (IMA) , который упрощает интеграцию мультимедийной рекламы в приложения iOS и Android, созданные с помощью Flutter. Плагин IMA может запрашивать рекламу с любого совместимого с VAST сервера объявлений и управлять воспроизведением рекламы в ваших приложениях. Реклама воспроизводится в отдельном видеоплеере, расположенном поверх видеоплеера контента приложения. Текущие поддерживаемые функции:
API на стороне клиента для запросов линейной потоковой видеорекламы
VAST и VMAP
Отдельные и групповые запросы
Пропускаемые объявления
Обновления плагинов для iOS и macOS с функцией встроенных покупок
Мы добавили поддержку StoreKit 2in_app_purchase_storekit
в пакет для миграции с API StoreKit 1, которые были объявлены устаревшими в iOS 18. Это позволяет нам добавлять новые функции StoreKit 2, такие как улучшенное управление подписками в будущем. Следите за предстоящим руководством по миграции, которое поможет вам перейти на новую функциональность StoreKit 2. Это некритическое изменение, поэтому вы можете мигрировать, когда захотите.
DevTools и IDE
Обновления Flutter DevTools
Этот релиз включает новые функции, общие улучшения надежности и полировки, а также некоторые захватывающие новые экспериментальные функции, которые вы можете включить из DevTools. См. раздел Previews и Experimental features ниже для получения дополнительной информации об этом.
Во-первых, мы добавили поддержку проверки настроек глубоких ссылок iOS в инструменте Flutter Deep Links. Теперь вы можете проверять глубокие ссылки для Android и iOS.
Проверка глубоких ссылок iOS в инструменте DevTools Deep Links.
Далее мы внесли некоторые улучшения в рабочий процесс работы с «офлайн» данными. Иногда необходимо экспортировать данные, которые вы просматриваете в DevTools, для будущего использования или для загрузки в другой инструмент. В этом выпуске добавлена поддержка экспорта сетевых данных в виде файла .har
и загрузки снимков памяти в DevTools для просмотра, когда DevTools не подключен к работающему приложению.
Кроме того, если вы когда-либо были в процессе отладки проблемы с памятью с помощью DevTools и теряли данные инструмента памяти из-за сбоя приложения (возможно, из-за той самой проблемы OOM, которую вы пытаетесь отладить), мы понимаем ваше разочарование! Мы исправили эту болевую точку UX, позволив вам продолжать просматривать самые последние данные инструмента памяти в DevTools, даже после отключения приложения.
Это всего лишь несколько основных моментов этого релиза. Чтобы узнать больше обо всех обновлениях, включенных в Flutter 3.27, ознакомьтесь с примечаниями к релизу DevTools 2.38.0 , 2.39.0 и 2.40.1 .
Предварительные версии и экспериментальные функции для ознакомления
Flutter DevTools — новый Flutter Inspector
Flutter Inspector претерпел некоторые существенные изменения для улучшения удобства использования и улучшения вашего пути отладки пользовательского интерфейса. Включите новый Inspector, переключив настройку «New Inspector».
Новый Flutter Inspector в DevTools.
Вот некоторые из изменений:
Сжатое дерево виджетов, которое упрощает просмотр глубоко вложенных деревьев виджетов Flutter. Это особенно полезно при использовании Flutter Inspector из вашей IDE, где горизонтальное пространство экрана ограничено.
Параметр для переключения, следует ли включать виджеты реализации в дерево виджетов. Виджеты реализации — это виджеты, которые вы не включили в код своего приложения, а вместо этого добавили в дерево виджетов фреймворк Flutter или другие пакеты.
Подробный просмотр выбранного виджета, в котором отображается встроенный просмотрщик макетов, свойства виджета и объекта визуализации, а также обозреватель макетов Flex для виджетов Flex и их дочерних элементов.
Скоро появятся новые улучшения для нового Инспектора, но эти изменения уже готовы к тому, чтобы вы их опробовали! Пожалуйста, сообщайте о любых проблемах, с которыми вы сталкиваетесь, чтобы мы могли их исправить, прежде чем включать новый Инспектор по умолчанию.
Flutter DevTools — попробуйте с WebAssembly
Включите функцию WebAssembly в настройках DevTools, чтобы загрузить скомпилированное с помощью WASM веб-приложение DevTools.
Это должно обеспечить лучшую производительность, чем скомпилированная JS-версия DevTools по умолчанию. Эта функция является экспериментальной, поэтому, пожалуйста, сообщайте о любых проблемах, с которыми вы столкнетесь при сборке WASM.
Настройка DevTools для использования сборки WebAssembly вместо сборки Javascript.
Критические изменения и устаревание
Material Design 3 жетона
Последние токены Material Design 3 (v6.1) были применены к библиотеке Flutter Material. Токены Material Design обновили отображение 4 цветовых ролей в режиме Light только для того, чтобы сделать их более визуально привлекательными, сохранив при этом доступный контраст. Мы не обнаружили никаких поломок в нашем тестировании этого изменения, которое применялось к этим свойствам цвета:
На первичном контейнере (Primary10 — Primary30)
На вторичном контейнере (Secondary10 to Secondary30)
На третичном контейнере (Tertiary10 to Tertiary30)
Контейнер On-error (Error10 to Error30)
Это влияет на виджеты, которые используют эти роли в качестве значений по умолчанию.
Цвет границы Chip
s ( Chip
, ActionChip
, ChoiceChip
, FilterChip
, и InputChip
) был обновлен с ColorScheme.outline
на ColorScheme.outlineVariant
. Это улучшает визуальную иерархию между фишками и кнопками.
Проекты iOS на Objective-C
С момента выхода Flutter 1.9.1 в 2019 году новые проекты iOS используют Swift по умолчанию. Создание нового проекта iOS Objective-C теперь устарело , и этот flutter create --ios-language objc
флаг будет удален в будущей версии Flutter. Вы по-прежнему сможете открыть свой проект Xcode и добавить файлы Objective-C, в том числе для плагинов. Java по-прежнему поддерживается для приложений Android с этим flutter create --android-language java
флагом.
Флаг по умолчанию для глубоких ссылок
Значение по умолчанию для флага глубоких ссылок Flutter изменилось с false на true , что означает, что теперь глубокая ссылка включена по умолчанию. Если вы используете настройку глубоких ссылок Flutter по умолчанию, вам больше не нужно вручную устанавливать флаг на true .
Однако если вы используете сторонние плагины для глубоких ссылок, например:
Это обновление внесёт критическое изменение. В этом случае вам нужно будет вручную сбросить флаг глубоких ссылок Flutter на false .
Более подробную информацию можно найти в проектной документации: flutter.dev/go/deep-link-flag-migration .
Прекращение поддержки старых SDK в IDE
Чтобы гарантировать, что мы можем продолжать предоставлять высококачественный опыт разработки, мы вносим изменения в поддержку плагинов IDE. Поскольку плагины Dart и Flutter для VS Code и IntelliJ развивались, поддержка старых версий Dart SDK становилась все более сложной.
Начиная с выпуска Dart 3.6, мы прекращаем поддержку версий Dart SDK старше 3.0 (выпущенных в мае 2023 г.). Это означает, что, хотя инструменты могут по-прежнему работать со старыми SDK, мы больше не будем предоставлять официальную поддержку или исправления проблем, характерных для этих версий.
С выпуском Dart 3.7 (предполагаемый в первом квартале 2025 года) мы полностью прекратим поддержку этих старых версий SDK. Будущие выпуски плагинов могут быть несовместимы с этими версиями.
Что это значит для вас?
Если вы используете старую версию Dart SDK, мы рекомендуем вам обновить ее до версии 3.0 или более поздней, чтобы продолжить получать поддержку и обновления.
Это изменение затронет менее 1% наших пользователей и позволит нам сосредоточиться на предоставлении наилучшего опыта для подавляющего большинства разработчиков.
Закрытие
Информацию обо всех критических изменениях в этом выпуске см. в полном списке руководств по миграции на странице критических изменений .
Как всегда, большое спасибо сообществу за предоставление тестов — они помогают нам выявлять критические изменения. Чтобы узнать больше, ознакомьтесь с политикой Flutter в отношении критических изменений .
Заключение
Огромное спасибо всему сообществу Flutter за то, что сделали этот релиз возможным! Ваш вклад, отзывы и энтузиазм — вот что движет Flutter вперед. Мы невероятно взволнованы будущим Flutter и с нетерпением ждем, когда увидим потрясающие приложения, которые вы создадите с помощью Flutter 3.27.
Для полного обзора всех изменений ознакомьтесь с подробными примечаниями к выпуску и журналом изменений. Готовы испытать новейшее и лучшее? Просто запустите flutter upgrade
и начните сборку!