Вышла версия Flutter 3.47, и вместе с ней мы получили несколько интересных нововведений.
Сегодня мы приветствуем выпуск версии 1.0 автономного приложения material_uiи cupertino_uiпакетов. Это важная веха, которая отделяет системы проектирования от основного SDK.
Мы также повышаем производительность и улучшаем инструменты во всех областях. В этом релизе Impeller по умолчанию доступен для настольных компьютеров, наши конвейеры подготовлены для iOS, macOS и Xcode 27, а предварительные версии виджетов Flutter переведены в стабильную версию.
Итак, 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.
-
Мы сможем быстрее и чаще внедрять новые материалы и обновления.
-
Мы заложили основу для нейтрального по стилю каталога виджетов ядра Flutter, что упростит создание пользовательских дизайн-систем в будущем.
Как осуществить миграцию
Для переноса вашего проекта на новые автономные пакеты выполните следующую команду:
dart fix --apply --code=migrate_design_widgets
Этот инструмент автоматически обновляет импортированные данные из новых автономных пакетов package:flutter/material.dartи обратно.package:flutter/cupertino.dart
Примечание: Если инструмент миграции столкнется с проблемами при обновлении ваших данных
pubspec.yaml(известная ранняя ошибка), вы можете устранить ее, запустив инструмент вручнуюflutter pub add material_ui(и,cupertino_uiесли вы его используете), а затем запустив егоdart fix --applyеще раз.
Оригинальные библиотеки проектирования, входящие в состав основного SDK, планируется официально вывести из эксплуатации в предстоящем стабильном осеннем релизе в ноябре. Если вы переносите пакет в рамках экосистемы, рассматривайте этот переход к автономным пакетам как крупный релиз.
Преодоление миграционного разрыва
Для облегчения перехода экосистемы на новые автономные библиотеки проектирования material_uiи cupertino_uiвключения в комплект утилит миграции, это MaterialUiCompatibilityBridgeпозволит вашему приложению немедленно перейти на автономные пакеты, даже если некоторые из зависимостей ваших пакетов все еще используют устаревшие импорты из основного SDK.
Например, вы можете обернуть свое приложение в мост совместимости:
import 'package:material_ui/material_ui.dart';void main() { runApp(const MyApp());}class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)), ), builder: (BuildContext context, Widget? child) { return MaterialUiCompatibilityBridge(child: child!); }, home: const HomeScreen(), ); }}
Разделенная локализация
В рамках этого перехода flutter_localizationsтакже был выделен из пакета. Делегаты локализации и переведенные строки для виджетов Material и Cupertino теперь находятся внутри package:material_ui и package:cupertino_uiсоответственно.
До:
import 'package:flutter_localizations/flutter_localizations.dart';import 'package:flutter/material.dart';// ...localizationsDelegates: const <LocalizationsDelegate<dynamic>>[ GlobalCupertinoLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate,],
После:
import 'package:material_ui/material_ui.dart';// ...localizationsDelegates: GlobalMaterialLocalizations.delegates,
localizationsDelegatesТеперь в настройки GlobalMaterialLocalizations.delegates включены также делегаты Cupertino и Widgets, что упрощает процесс настройки.
Открыто для внесения предложений.
Заморозив внесение изменений в библиотеки Material и Cupertino еще в апреле, мы смогли обеспечить плавную миграцию. Библиотеки, которые вас ждут, material_ui cupertino_ui — это те же самые библиотеки, которыми вы уже пользуетесь.
Теперь, когда мы готовы снять заморозку, ждите регулярных обновлений и новых функций в новых пакетах, релизы которых в настоящее время планируются еженедельно. Мы также рады официально открыть эти пакеты для участия сообщества.
Подготовка к следующей волне обновлений Apple.
В связи с выходом Xcode 27, iOS 27 и macOS 27 этой осенью, мы уделили большое внимание подготовке Flutter к предстоящим обновлениям. Чтобы ваши пользователи не столкнулись с неожиданностями в первый же день, мы рекомендуем уже сейчас тестировать ваши приложения на бета-версиях Apple.
Кроме того, для поддержки Xcode 27 были увеличены минимальные поддерживаемые версии ОС:
|
Платформа |
Предыдущий минимум |
Новый минимум (Flutter 3.47+) |
|---|---|---|
|
iOS |
13 |
15 |
|
macOS |
10.15 |
12 |
мандат жизненного цикла UIScene
В iOS 27 SDK теперь требуется соблюдение UISceneжизненного цикла для всех приложений, использующих UIKit. Приложения, созданные с помощью Xcode 27 и не поддерживающие UIKit, UISceneне будут запускаться при загрузке системы.
Для большинства приложений Flutter CLI выполняет эту миграцию автоматически во время сборки. Однако, если у вас есть собственный нативный код AppDelegateили вы используете плагины, которые по-прежнему зависят от устаревшего жизненного цикла приложения, потребуется ручная миграция. В таких случаях необходимо выполнить миграцию вручную, следуя руководству по внедрению UIScene/Delegate.
Постепенный вывод из эксплуатации компьютеров Mac на базе процессоров Intel.
В соответствии с переходом Apple на процессоры Apple Silicon, Flutter сворачивает поддержку компьютеров Mac на базе Intel. Мы отключили автоматический запуск тестов на оборудовании Intel, и теперь интерфейс командной строки Flutter выводит предупреждения при сборке на хостах Intel или при работе с двухъядерными архитектурами. В будущих версиях эти предупреждения будут преобразованы в ошибки.
Вы можете сразу же включить сборку приложений macOS, предназначенных только для архитектуры ARM64, запустив команду flutter config --enable-macos-arm64-only.
Прогресс Swift Package Manager
Сообщество добилось невероятного прогресса в переходе на Swift Package Manager: 92 из 100 самых популярных плагинов для iOS уже перенесены. Если вы ранее отключали Swift Package Manager, вы можете попробовать снова, запустив команду flutter config --enable-swift-package-manager.
Поскольку CocoaPods сейчас находится в режиме поддержки, плагины, которые не будут перенесены на SwiftPM, в конечном итоге перестанут работать. Неперенесенные плагины также получат более низкие pub.devоценки. Если вы поддерживаете плагин, ознакомьтесь с руководством по миграции и прочтите нашу предыдущую статью в блоге для получения более подробной информации.
В этом релизе также оптимизировано время сборки благодаря участнику сообщества @lukemmtt , который улучшил конвейеры сборки, отфильтровав ненужные схемы пакетов SwiftPM на ранних этапах процесса сборки.
Настройка курса для Wasm по умолчанию
Мы активно работаем над тем, чтобы включить WebAssembly (Wasm) по умолчанию для веб-приложений Flutter, обеспечивая производительность, сравнимую с нативной, в браузере. Если вы еще не тестировали свои веб-приложения с Wasm, вы можете включить его сегодня, передав соответствующий --wasmфлаг команде сборки релиза:
flutter build web --release --wasm
При подготовке к этому переходу помните, что Wasm требует миграции вашей кодовой базы на новый пакет взаимодействия с JavaScript ( package:web), поскольку устаревшая dart:htmlбиблиотека не поддерживается. Обновление зависимостей пакетов вашего проекта часто автоматически решает эти проблемы взаимодействия с устаревшими библиотеками.
Для масштабирования крупных веб-приложений в этом релизе также представлена экспериментальная поддержка отложенной загрузки в Wasm. Доступная под флагом в основном канале, она позволяет разделить ваше Wasm-приложение на более мелкие модули с отложенной загрузкой, оптимизируя время первоначальной загрузки:
flutter build web --release --wasm --enable-wasm-deferred-loading
Современная графика доступна на десктопах благодаря 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 теперь поддерживают всплывающие окна, что позволяет создавать собственные контекстные меню и палитры инструментов.
Теперь вы также можете запрашивать информацию windowHandleу контроллеров, специфичных для платформы, чтобы получить прямой указатель на базовое нативное окно ( HWND, NSWindow, или GtkWindow). Это обеспечивает доступ к расширенным нативным функциям, таким как закрепляемые панели в Windows, например, как в этом примере с закрепляемыми панелями, предоставленном @orestesgaolin :
Мы также исправили несколько ошибок, связанных с фокусировкой окон и реализацией. В Windows активация окна больше не перемещает фоновые окна вперед и не перехватывает фокус обратно при возобновлении работы приложения, благодаря участнику @9AZX :
В Linux при создании многооконных систем окна теперь явно создаются до того, как получат свой первый кадр от композитора, что исправляет предупреждения о преждевременной отрисовке и ошибки композитора.
Мы также добавили новый API для автоматического изменения размера окон в соответствии с содержимым, который позволяет создавать обычные и диалоговые окна, размер которых автоматически подстраивается под их содержимое.
Варианты оформления для настольных компьютеров
Теперь Windows и Linux поддерживают различные версии Flutter.
Например, в вашем pubspec.yamlфайле могут использоваться разные ресурсы для разных версий:
flutter: assets: - path: assets/flavor_a/images flavors: - flavor_a - path: assets/flavor_b/images flavors: - flavor_c
Используйте эту --flavorопцию, чтобы указать желаемый вкус. Например:
-
flutter build windows --flavor flavor_a -
flutter build linux --flavor flavor_a
Спасибо @AngeloAvv за замечательные материалы!
Более четкий текст на рабочем столе
Экраны настольных компьютеров часто имеют меньшую плотность пикселей, чем мобильные дисплеи, но обладают большей вычислительной мощностью графики. Для обеспечения более четкого текста и более чистых векторных кривых на настольных компьютерах движок Flutter, использующий Impeller, теперь применяет рендеринг с помощью функции знакового расстояния (SDF) в macOS, Linux и Windows.
Стабильные предварительные версии и обновления GenUI
Предварительный просмотр виджетов стал стабильным.
Теперь доступна стабильная версия Flutter Widget Preview, позволяющая мгновенно отображать, проверять и дорабатывать отдельные компоненты пользовательского интерфейса без сборки или запуска всего приложения.
В этой стабильной версии вы можете ожидать:
-
Более быстрая загрузка проекта благодаря локальному кэшированию в
.widget_preview/папке, что исключает необходимость повторной настройки. -
Более гибкое тестирование благодаря абстрактному
PreviewThemeDataAPI, поддерживающему последовательное наложение тем для сложных матричных тестов. -
Автоматическая синхронизация веб-ресурсов при предварительном просмотре веб-виджетов, прямое копирование ресурсов вашего проекта
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 (KGP): 2.4.0
-
Android Gradle Plugin (AGP): 9.1.0 (новейшая версия, совместимая с KGP 2.4.0)
-
Gradle: 9.3.1 (минимально необходимая версия для AGP 9.1.0)
Чтобы обеспечить успешную сборку вашего приложения в будущих релизах, мы рекомендуем использовать стандартные переменные уровня API, предоставляемые Flutter SDK, в файлах сборки. В этом релизе они настроены со следующими значениями по умолчанию:
-
flutter.compileSdkVersion(API 36) -
flutter.targetSdkVersion(API 36) -
flutter.minSdkVersion(API 24)
iOS и macOS
Для разработчиков iOS процесс подписания кода стал более прозрачным. Благодаря участнику сообщества @alex-medinsh , CLI отображает как идентификатор команды, так и имя команды при выборе сертификата.
Кроме того, участник сообщества @mozammal-hossain улучшил процесс устранения неполадок, предоставив более понятные сообщения об ошибках профиля подготовки при сбое подписи.
Рабочий стол
Настольные платформы также получили целенаправленные улучшения. На Windows решена проблема позиционирования курсора при наборе корейского текста (благодаря @CHOIgoung ), а плагины для Windows теперь могут переносить ресурсоемкие задачи из потока платформы с помощью FlutterEngine::PostPlatformThreadTask. На Linux @CodeDoctorDE добавил вращение стилуса и отчеты о силе нажатия.
Графика и движок
В движке фрагментные шейдеры, ориентированные на OpenGLES, больше не требуют условного инвертирования координат при чтении текстур. Теперь это обрабатывается в вершинном шейдере. Подробнее см. страницу, посвященную изменениям, нарушающим совместимость рендеринга OpenGLES с текстурами.
Исправление структуры
Наконец, сама структура стала более плавной, а улучшения распределены по ключевым компонентам:
Доступность и семантика: благодаря @xxxOVALxxx ( MediaQueryData.highContrastи ) теперь автоматически определяются настройки высокой контрастности и инверсии цвета в Android MediaQueryData.invertColors. Вложенные текстовые блоки внутри Text.richтеперь соответствуют своей последовательности компоновки в дереве семантики, а для добавлена блокировка фокуса клавиатуры BlockSemantics.
Текст и выделение: теперь маркеры выделения текста на мобильных устройствах остаются стабильными при незначительной прокрутке, а сочетания клавиш позволяют закрывать открытые меню выделения. На Android маркеры выделения больше не закрывают контекстное меню, если расположены в верхней части экрана, благодаря @JhonaCodes .
|
|
|
Мы также исправили ошибку, приводившую к сбою SelectableRegionпри начале выделения в пустом прокручиваемом контейнере, и устранили визуальные артефакты подсветки на затемненном выделяемом тексте, благодаря @ikramhasan .
Жесты и прокрутка: Улучшена передача жестов для нативных представлений iOS, встроенных через представления платформы. EdgeDraggingAutoScrollerТеперь учитывается значение ScrollPhysicsактивного прокручиваемого представления, что предотвращает автоматическую прокрутку заблокированных списков.
Улучшения основного виджета: сохранение исходных цветов внутри ImageIcon с помощью useOriginalColors: true, указание поведения обрезки в AnimatedCrossFadeи отслеживание ошибок потока изображений непосредственно с помощью ImageStreamListener.
Готов к обновлению
Все детали установлены, фундамент готов. Осталось только перенести эти обновления на ваш локальный компьютер:
flutter upgrade
Пока ваш SDK обновляется в фоновом режиме, у нас для вас есть домашнее задание (довольно интересное):
-
Знакомьтесь с участниками проекта: запаситесь попкорном и смотрите нашу новую серию видеороликов «Знакомство: важные коммиты Flutter» , посвященную членам сообщества, благодаря которым стал возможен этот релиз.
-
Проверьте подробности: бегло просмотрите страницу с критическими изменениями , чтобы быть готовыми к миграции автономных пакетов пользовательского интерфейса.
Мы с нетерпением ждём, что вы создадите с помощью этой новой и улучшенной версии Flutter!
ссылка на оригинал статьи https://habr.com/ru/articles/1070180/