1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Flutter-370.md 37 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Первый выпуск в 2023 году, Flutter 3.7 вышел,快来瞧瞧有哪些新特性

Оригинальная статья доступна по ссылке: https://medium.com/flutter/whats-new-in-flutter-3-7-38cbea71133c

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

Кроме того, в Flutter 3.7 были улучшены глобальное выделение, использование Impeller для повышения производительности рендера, DevTools и прочие функции с постоянными улучшениями производительности.

Примечание: Версия 3.7 включает множество новых возможностей, кажется, что версия 4.0 уже совсем близко.

Улучшение поддержки Material 3

С переходом следующих виджетов, поддержка Material 3 значительно улучшилась в версии 3.7:

  • Badge
  • BottomAppBar
  • Filled и FilledTonal кнопки
  • SegmentedButton
  • Checkbox
  • Divider
  • Меню
  • DropdownMenu
  • Drawer и NavigationDrawer
  • ProgressIndicator
  • Radio кнопки
  • Slider
  • SnackBar
  • TabBar
  • TextField и InputDecorator
  • Banner

Чтобы использовать эти новые возможности, достаточно установить флаг useMaterial3 в объекте ThemeData.Для полного использования всех возможностей Material 3 также требуется полная цветовая схема Material 3. Это можно сделать с помощью нового инструмента темы или с использованием параметра colorSchemeSeed конструктора для создания объекта ThemeData:```dart MaterialApp( theme: ThemeData( useMaterial3: true, colorSchemeSeed: Colors.green, ), // ... );


> Для просмотра всех новых возможностей Material 3 используйте [интерактивный демонстрационный пример](https://flutter-experimental-m3-demo.web.app/#/) с этими компонентами.

![Пример работы Material 3](http://img.cdn.guoshuyu.cn/20230125_F37/image1.gif)


## Меню и выпадающие меню

Теперь Flutter позволяет создавать меню и выпадающие контекстные меню.

**Для macOS можно использовать `PlatformMenuBar` для создания меню, которое определяется нативным меню macOS вместо Flutter**.

Кроме того, для всех платформ можно определить [меню Material Design](https://m3.material.io/components/menus/overview), которое предоставляет выпадающее меню (`MenuBar`) или самостоятельное выпадающее меню (`MenuAnchor`), вызываемое пользовательским интерфейсом.

Эти меню полностью настраиваемы, пункты меню могут быть любыми пользовательскими виджетами или новыми виджетами пунктов меню (`MenuItemButton`, `SubmenuButton`).![](http://img.cdn.guoshuyu.cn/20230125_F37/image2.png)

# Предварительный просмотр Impeller

Радо объявить, что новый [рендеринговый движок Impeller](https://github.com/flutter/engine/tree/main/impeller) теперь доступен для предварительного просмотра в канале Stable на iOS.

**Команда Flutter уверена, что производительность Impeller будет соответствовать или превзойдет производительность большинства приложений с использованием рендера Skia, а также что реализация Impeller обеспечивает высокую степень верности практически во всех крайних случаях использования**.> В будущих версиях стабильной версии Impeller может стать основным рендером по умолчанию для iOS. Если вы заметили какие-либо проблемы, пожалуйста, сообщите об этом через раздел обратной связи на [GitHub](https://github.com/flutter/flutter/issues).

Хотя текущие ожидания заключаются в том, чтобы Impeller удовлетворил потребности почти всех существующих приложений Flutter на iOS, все еще остаются некоторые различия по части API:

На [wiki Flutter](https://github.com/flutter/flutter/wiki/Impeller#status) представлен список незакрытых случаев, где могут возникнуть различия между Skia и Impeller в процессе рендера, что может вызвать ошибки. Поэтому если вы столкнулись с какими-либо проблемами, пожалуйста, сообщите об этом через раздел [GitHub Issues](https://github.com/flutter/flutter/issues).

> Вклад сообщества значительно ускорил прогресс работы над Impeller. Особенно стоит отметить вклад GitHub пользователей [ColdPaleLight](https://github.com/ColdPaleLight), [guoguo338](https://github.com/guoguo338), [JsouLiang](https://github.com/JsouLiang) и [magicianA](https://github.com/magicianA), которые внесли 37 из 291 исправлений, связанных с Impeller (более 12%).

Кроме того, команда Flutter продолжает работу над поддержкой Impeller с использованием Vulkan (с откатом на OpenGL на старых устройствах), но Impeller для Android пока недоступен. Поддержка Android находится в активной стадии разработки, и мы планируем предоставить больше информации о нем в будущих версиях — а также о поддержке desktop и web.> Вы можете следить за прогрессом на [канбане проекта Impeller на GitHub](https://github.com/orgs/flutter/projects/21).

# Проверка версий iOS

При выпуске приложения iOS, [список настроек для проверки](https://docs.flutter.dev/deployment/ios#review-xcode-project-settings) гарантирует, что ваше приложение готово для отправки в App Store. `![](http://img.cdn.guoshuyu.cn/20230125_F37/image3.png)` 

Команда `flutter build ipa` теперь выполняет проверку некоторых из этих настроек, и при необходимости разработчики получают уведомление о том, требуется ли внести изменения в приложение перед публикацией.


# Обновление средств разработки

В версии 3.7 были внесены несколько улучшений в новые средства и функции.

К инструментам DevTools добавлено три новых вкладки с возможностями профилирования памяти — **Profile**, **Trace** и **Diff**. Они поддерживают все ранее доступные возможности отладки памяти и добавляют новые для удобства работы.

![](http://img.cdn.guoshuyu.cn/20230125_F37/image4.png)

Новые возможности включают:

- Анализ текущего распределения памяти приложения по классам и типам памяти;
- Исследование кодовых путей, которые выделяют память для группы классов во время выполнения;
- Сравнение снимков памяти для понимания управления памятью между двумя моментами времени;

> Все эти новые возможности отслеживания памяти подробно описаны на странице [docs.flutter.dev](https://docs.flutter.dev/development/tools/devtools/memory).На странице производительности также появились некоторые новые полезные функции. В разделе **Frame Analysis** в верхней части страницы производительности представлен анализ выбранного фрейма Flutter:

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

![](http://img.cdn.guoshuyu.cn/20230125_F37/image5.png)

Это лишь некоторые из ключевых улучшений DevTools в версии 3.7, которая также включает исправления ошибок и дополнительные улучшения, такие как важные исправления ошибок в инспекторе, профилировщике сети и профилировщике ЦПУ.

> Для более глубокого списка всех улучшений обратитесь к списку изменений выпуска DevTools в Flutter 3.7.

# Создание пользовательских контекстных меню

**С версии 3.7 можно создавать пользовательские контекстные меню в любом месте Flutter-приложения и использовать их для настройки встроенных контекстных меню**.

Например, разработчики могут добавить кнопку "Отправить электронное письмо" в стандартную панель инструментов выбора текста, так что она будет отображаться, когда пользователи выбирают адрес электронной почты ([код](https://github.com/flutter/samples/blob/main/experimental/context_menus/lib/email_button_page.dart)).

![](http://img.cdn.guoshuyu.cn/20230125_F37/image6.gif)Через параметр `contextMenuBuilder`, который был добавлен ко всем виджетам, отображающим контекстное меню по умолчанию, такому как `TextField`.

> Теперь разработчики могут возвращать любой виджет через `contextMenuBuilder`, включая модификацию стандартного платформенного адаптивного контекстного меню. Новая функция также применима за пределами выбора текста, например, при создании объекта `Image`, а затем отображении кнопки "Сохранить" при нажатии правой кнопки мыши или долгом нажатии ([код](https://github.com/flutter/samples/blob/main/experimental/context_menus/lib/image_page.dart)). С помощью `ContextMenuController` можно отобразить контекстное меню по умолчанию текущей платформы или пользовательское меню в любом месте приложения.

![image7.gif](http://img.cdn.guoshuyu.cn/20230125_F37/image7.gif)

Дополнительные примеры доступны в [Flutter Demo context_menus](https://github.com/flutter/samples/tree/main/experimental/context_menus).

## Виджеты `CupertinoListSection` и `CupertinoListTile`

К новым виджетам в Cupertino добавлены `CupertinoListSection` и `CupertinoListTile`, используемые для отображения списков скроллируемых элементов в стиле iOS.

Это версия для Cupertino виджетов Material `ListView` и `ListTile`.

| ![](http://img.cdn.guoshuyu.cn/20230125_F37/image8.png) | ![](http://img.cdn.guoshuyu.cn/20230125_F37/image9.png) |
| ------------------------------------------------------- | ------------------------------------------------------- |

## Улучшения скроллинга

В версии 3.7 были внедрены несколько [обновлений скроллинга](https://github.com/flutter/flutter/issues?page=1&q=is%3Aissue+is%3Aclosed+closed%3A2022-07-11..2022-11-30+label%3A%f3A+scrolling+reason%3Acompleted).- Улучшение взаимодействия с трэкпадом
- Новые виджеты (например, `Scrollbars` и `DraggableScrollableSheet`)
- Улучшение обработки текстового выбора в контексте скроллинга

Особое внимание заслуживает то, что [приложения macOS теперь будут иметь более высокую детализацию благодаря добавлению новых физических свойств скроллинга](https://github.com/flutter/flutter/pull/108298), чтобы лучше соответствовать платформе рабочего стола.

Также представлены новые анимированные виджеты `AnimatedGrid` и `SliverAnimatedGrid`.

![image10.gif](http://img.cdn.guoshuyu.cn/20230125_F37/image10.gif)

Кроме того, были исправлены проблемы в конструкторах нескольких виджетов скроллинга, таких как `ListView`:

В процессе миграции на NNBD в Flutter-фреймворке, ранее `itemBuilder` позволял пользователям предоставлять виджеты по требованию, но после перехода на `IndexedWidgetBuilder` стало запрещено возвращать `null`.

Это значит, что `itemBuilder` больше не может возвращать `null`. Это ограничение было исправлено с использованием `NullableIndexedWidgetBuilder`.

![image11.png](http://img.cdn.guoshuyu.cn/20230125_F37/image11.png)

# Инструменты и документация для международизации

Поддержка международизации была полностью улучшена в версии 3.7 за счет полной перезаписи инструмента `gen-l10n`:

- Описание синтаксических ошибок
- Поддержка сложных сообщений, включающих вложенные/несколько множеств, выбор и заполнители.![Иллюстрация](http://img.cdn.guoshuyu.cn/20230125_F37/image12.png)

> Для получения дополнительной информации обратитесь к обновленному разделу [Международизация приложений Flutter](https://docs.flutter.dev/development/accessibility-and-localization/internationalization).

## Улучшенная поддержка области выделения

Компонент `SelectionArea` теперь поддерживает выделение с помощью клавиатуры. Разработчики могут использовать сочетание клавиш, таких как `shift+влево`, чтобы расширять текущее выделение.

![Пример использования](http://img.cdn.guoshuyu.cn/20230125_F37/image13.png)

## Бэкграундовые изоляты

С версии 3.7 [Platform Channels](https://docs.flutter.dev/development/platform-integration/platform-channels) можно вызывать из любого изолированного процесса (`Isolate`). Раньше пользователи могли вызывать платформенные каналы только из основного изолированного процесса, предоставляемого Flutter. Теперь [плагины](https://docs.flutter.dev/development/packages-and-plugins/developing-packages) или [add-to-app](https://docs.flutter.dev/development/add-to-app) могут лучше взаимодействовать с изолированными процессами и кодом хостовой платформы.

> Для получения дополнительной информации просмотрите раздел [платформенно-зависимого кода](https://docs.flutter.dev/development/platform-integration/platform-channels) на сайте flutter.dev и статью [введение в бэкграундовые изоляты](https://medium.com/flutter/introducing-background-isolate-channels-7a299609cad8).

## Увеличивающийся луп для текста

С версии 3.7 увеличивающийся луп для текста появляется при выборе текста на Android и iOS.Это встроенная возможность для всех приложений с возможностью выбора текста, но если вы хотите отключить или настроить её, воспользуйтесь свойством [magnifierConfiguration](https://master-api.flutter.dev/flutter/material/TextField/magnifierConfiguration.html).

| ![Пример работы](http://img.cdn.guoshuyu.cn/20230125_F37/image14.gif) | ![Другой пример работы](http://img.cdn.guoshuyu.cn/20230125_F37/image15.gif) |

## Быстрое миграционное преобразование плагинов

Поскольку Apple теперь сосредоточена на использовании Swift для своих API, мы хотим создать справочные материалы, чтобы помочь разработчикам плагинов Flutter использовать Swift для миграции существующих плагинов или создания новых. > [quick_actions](https://pub.dev/packages/quick_actions) плагин был мигрирован с Objective-C на Swift и может использоваться как демонстрация лучших практик. Если вы заинтересованы в помощи нам в миграции плагинов, пожалуйста, обратитесь к разделу [Swift миграции](https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#swift-migration-for-1p-plugins) в wiki.

## Ресурсы для разработчиков iOS

Мы выпустили новые ресурсы для разработчиков iOS, включая:

- [Flutter для разработчиков SwiftUI](https://docs.flutter.dev/get-started/flutter-for/ios-devs?tab=swiftui)
- [Dart для разработчиков Swift](https://dart.dev/guides/language/coming-from/swift-to-dart)
- [Потокобезопасность Flutter для разработчиков Swift](https://docs.flutter.dev/resources/dart-swift-concurrency)
- [Добавление Flutter в существующее приложение SwiftUI](https://docs.flutter.dev/development/add-to-app/ios/add-flutter-screen)
- [Создание вариаций с помощью Flutter](https://docs.flutter.dev/deployment/flavors) (для Android и iOS)### Устаревание Bitcode

[Начиная с Xcode 14, приложения watchOS и tvOS больше не требуют Bitcode, а App Store перестал принимать Bitcode от Xcode 14.](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes)

> В связи с этим Flutter прекратил поддержку Bitcode.

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

Однако если вы вручную активировали Bitcode в проекте Xcode, немедленно деактивируйте его после обновления до Xcode 14.

Вы можете это сделать, открыв `ios/Runner.xcworkspace` и установив значение **Enable Bitcode** как **No**, разработчики Add-to-app могут отключить его в хостовом проекте Xcode.

![Изображение](http://img.cdn.guoshuyu.cn/20230125_F37/image16.png)


### Бэкдроп-фильтр для PlatformView iOS

Мы добавили возможность делать нативные iOS-вьюшки размытыми при отображении под виджетами Flutter с эффектом размытия, а также `UiKitView` теперь может быть обёрнут в `BackdropFilter`.

![Изображение](http://img.cdn.guoshuyu.cn/20230125_F37/image17.png)

> Для получения более подробной информации обратитесь к [документации по дизайну iOS PlatformView BackdropFilter](http://flutter.dev/go/ios-platformview-backdrop-filter-blur).


### Управление памятью

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

- Уменьшение замедления при сборке мусора
- Уменьшение использования ЦП благодаря скорости распределения и фоновым потокам сборки мусора
- Уменьшение потребления памятиКак пример, Flutter расширил существующую поддержку ручного освобождения некоторых объектов `dart:ui`.

> Ранее native ресурсы управлялись Flutter-движком до того момента, пока Dart VM не выполнял сборку мусора для Dart-объектов.

Анализ пользовательских приложений и наши собственные бенчмарки показывают, что данная стратегия недостаточна для предотвращения неуместной сборки мусора и чрезмерного использования памяти. **Поэтому в этом выпуске движок Flutter добавил явные методы освобождения нативных ресурсов, используемых объектами `Vertices`, `Paragraph` и `ImageShader`.**

![image18.png](http://img.cdn.guoshuyu.cn/20230125_F37/image18.png)


> В рамках миграции на базовый тестовый фреймворк Flutter эти улучшения сократили время сборки 90% кадров более чем на 30%, что приведёт к более плавным анимациям и меньшим задержкам.

Кроме того, движок Flutter больше не регистрирует размер GPU-изображений в Dart VM, а вместо этого они освобождаются вручную при необходимости.

Схожим образом, теперь стратегия движка Flutter состоит в том, чтобы отчитываться Dart VM только о поверхностной глубине нативных объектов, поддерживающих `dart:ui`.

![image19.png](http://img.cdn.guoshuyu.cn/20230125_F37/image19.png)

> В тестах это изменение устранило синхронное очистное сборщиком мусора событие во время создания виджета GPU-изображений.

В этом выпуске движок Flutter также лучше использует информацию о состоянии Flutter-приложения для динамического обновления Dart VM.> В настоящее время Flutter использует API стиля RAIL Dart VM для входа в режим низкой задержки во время переходных анимаций маршрутов.

В режиме низкой задержки менеджер памяти Dart VM склонен к увеличению объема памяти, а не к сборке мусора, чтобы избежать прерываний анимаций из-за пауз сборщика мусора.

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

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

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


# Отключение поддержки macOS 10.11–10.13

Flutter больше не поддерживает версии macOS 10.11, 10.12 и 10.13. После выпуска версии 3.7 поддержка версий 10.13 будет прекращена. Это значительно упрощает кодовую базу команды. Это также означает, что приложения, созданные с использованием стабильной версии Flutter SDK начиная с версии 3.7, больше не будут совместимы с этими версиями, а минимальная поддерживаемая версия macOS в Flutter увеличена до 10.14 Mojave.Поэтому, поскольку все поддерживаемые версии iOS и macOS Flutter содержат поддержку Metal, OpenGL-backend был удален из интеграторов iOS и macOS. После удаления этих компонентов размер сжатого Flutter-движка уменьшился примерно на 100 КБ.


## toImageSync

В версии 3.7 методы `Picture.toImageSync` и `Scene.toImageSync` были добавлены в `dart:ui`.

> Аналогично асинхронному `Picture.toImage`, когда `Picture` преобразуется в `Image`, `Scene.toImageSync` возвращает синхронный хэндл, а затем выполняет асинхронное растровое преобразование `Image` в фоновом режиме.

**Изображение будет сохранено как постоянное состояние GPU, когда контекст GPU доступен**, что позволяет достичь более быстрой скорости рендера по сравнению с `toImage` (генерируемое изображение также может быть сохранено в состоянии GPU, но эта оптимизация еще не реализована в данном сценарии).

Новый API `toImageSync` поддерживает следующие случаи использования:

- Быстрый рендеринг дорогостоящих изображений для повторного использования во многих кадрах.
- Применение многоканальных фильтров к изображению.
- Применение пользовательских шейдеров.

Например, фреймворк Flutter [теперь использует этот API](https://github.com/flutter/flutter/pull/106621), чтобы повысить производительность при переходе между страницами на Android, что почти вдвое уменьшает время растрового преобразования кадров, снижает заикание и позволяет анимациям достигать частоты обновления экрана 90/120 Гц на устройствах, поддерживающих эти значения.### Улучшение поддержки пользовательских шейдеров

В версии 3.7 было значительно улучшено поддерживание пользовательских фрагментных шейдеров в Flutter.

**Теперь Flutter SDK включает шейдерный компилятор, который компилирует GLSL шейдеры, указанные в файле `pubspec.yaml`, в правильный специфический формат для целевой платформы**.

Кроме того, пользовательские шейдеры теперь могут быть горячо перезагружены, а backend Skia и Impeller на iOS также поддерживают пользовательские шейдеры.

> Дополнительная информация доступна в документации [docs.flutter.dev](https://docs.flutter.dev/development/ui/advanced/shaders) по написанию и использованию пользовательских фрагментных шейдеров, а также в пакете `flutter_shaders` на сайте pub.dev.

### Горячая перезагрузка шрифтов

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

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

### Уменьшение затухания анимации на устройствах iOS

Благодаря открытому вкладу [luckysmg](https://github.com/luckysmg) были сделаны улучшения, которые снизили затухание анимации на устройствах iOS, особенно во время жестов. На главном потоке был добавлен виртуальный объект `CADisplayLink`, который теперь заставляет устройство работать со максимальной частотой обновления.Кроме того, анимация клавиатуры теперь имеет такую же частоту обновления, как и анимация движка Flutter, благодаря установке значения `CADisplayLink`.

Из-за этих изменений пользователи должны заметить более плавную и согласованную работу анимаций на устройствах iOS с частотой  Yöntem 120 Гц.

# Личные мысли

Это основные обновления от команды Flutter для версии Flutter 3.7:

- Самым заметным является возможность предварительного просмотра Impeller на устройствах iOS, что сулит будущее повышение производительности.
- Обновления, связанные с меню, значительно расширили возможности Flutter в области редактирования и выбора.
- Улучшения глобального выбора и увеличения масштаба текста также помогли усовершенствовать экосистему работы с текстом в Flutter.
- Как всегда, были проведены оптимизации производительности и использования памяти, особенно на устройствах iOS.
- Разработчики получили больше возможностей для улучшения своих инструментов.

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

---

Коррекция:

Кроме того, анимация клавиатуры теперь имеет такую же частоту обновления, как и анимация движка Flutter, благодаря установке значения `CADisplayLink`.

Из-за этих изменений пользователи должны заметить более плавную и согласованную работу анимаций на устройствах iOS с частотой 120 Гц.

# Личные мысли

Это основные обновления от команды Flutter для версии Flutter 3.7:

- Самым заметным является возможность предварительного просмотра Impeller на устройствах iOS, что сулит будущее повышение производительности.
- Обновления, связанные с меню, значительно расширили возможности Flutter в области редактирования и выбора.
- Улучшения глобального выбора и увеличения масштаба текста также помогли усовершенствовать экосистему работы с текстом в Flutter.
- Как всегда, были проведены оптимизации производительности и использования памяти, особенно на устройствах iOS.
- Разработчики получили больше возможностей для улучшения своих инструментов.

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

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master