Google представил Flutter 3.3: что нового

Flutter-веб, повышение производительности при обработке текста, новые обновления для пакета go_router, DevTools. По традиции Flutter-команда Friflex публикует первый перевод официального релиза фреймворка.

Фреймворк

Глобальное выделение

С новым виджетом SelectionArea любой дочерний элемент виджета SelectionArea получил возможность свободного выделения текста.

Чтобы воспользоваться этой функцией, необходимо обернуть тело маршрута (например, Scaffold) виджетом SelectionArea. Flutter сделает все остальное!

Для более детального знакомства с виджетом можно посетить страницу SelectionArea API .

Ввод с трекпада

В Flutter 3.3 улучшена поддержка ввода с трекпада. Это не только обеспечивает более плавное управление, но и снижает вероятность неправильной интерпретации в некоторых случаях. Пример такого неправильного толкования можно найти на странице «Перетаскивание элемента пользовательского интерфейса» в книге с примерами Flutter . Прокрутите страницу вниз, чтобы добраться до экземпляра DartPad, и выполните следующие действия:

  • уменьшите размер окна так, чтобы в верхней части появилась полоса прокрутки;
  • наведите курсор на верхнюю часть;
  • используйте трекпад для прокрутки;
  • до установки Flutter 3.3 прокрутка на трекпаде перетаскивала элемент, т.к. Flutter отправлял эмулированные общие события;
  • после установки Flutter 3.3 прокрутка на трекпаде корректно прокручивает список. Flutter передает жест «прокрутка», который не распознается картами, но распознается представлением прокрутки.

Для получения дополнительной информации можно ознакомиться документом Flutter Trackpad Gesture design doc.

Рукописный ввод

Теперь Flutter поддерживает рукописный ввод Scribble с помощью Apple Pencil на iPadOS. Эта функция включена по умолчанию в CupertinoTextField, TextField и EditableText.

Ввод текста

Для улучшения редактирования текста в новом релизе появилась возможность получать детализированные обновления текста от TextInputPlugin платформы. Ранее TextInputClient предоставлял только редактирование без дельты между старым и новым. TextEditingDeltas и DeltaTextInputClient восполняют этот информационный пробел. Доступ к этим дельтам позволяет создать поле ввода со стилизованными диапазонами, которые расширяются и сужаются во время ввода текста. Чтобы узнать больше, посмотрите демо-версию Rich Text Editor.

Material Design 3

В Flutter 3.3 появились обновления для иконок, chips, а также большие и средние варианты виджета AppBar. Чтобы отслеживать ход миграции на Material Design 3, проверьте Bring Material 3 to Flutter на GitHub.

Иконки

Chip

Medium and large AppBar

Desktop

Windows

Ранее версия десктопного приложения для Windows задавалась файлом, специфичным для Windows. Такое поведение не соответствовало тому, как другие платформы устанавливали свои версии.

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

Для получения дополнительной информации о настройке версии приложения следуйте документации на docs.flutter.dev и руководству по миграции. Чтобы воспользоваться новой функцией, проекты, созданные до версии Flutter 3.3, должны быть обновлены.

Пакеты

go_router

Пакет go_router, поддерживаемый командой Flutter, упрощает маршрутизацию, предоставляя декларативный API на основе url. Это облегчает навигацию и работу с глубокими ссылками. Последняя версия (4.3) позволяет приложениям выполнять навигацию с использованием асинхронного кода и включает другие критические изменения, описанные в руководстве по миграции.

«go_router был опубликован больше чем год назад. И за это время набрал хороший рейтинг на pub.dev. Его основная идея – это простота. Его можно сравнить с auto_route. Но в go_router нет кодогенерации и полной документации по фичам, поэтому изучать его придется методом работы с example, проб и ошибок».

Никита Спирьянов, Head of mobile, Friflex.

Для получения дополнительной информации ознакомьтесь со страницей Навигация и маршрутизация на docs.flutter.dev.

Улучшения расширений VS Code

В расширении Visual Studio Code для Flutter есть несколько обновлений, включая улучшения для добавления зависимостей. Теперь можно добавить несколько зависимостей, разделенных запятыми, за один запрос помощью Dart: Add Dependency.

Об улучшениях расширений Visual Studio Code читайте на сайте:

Обновления Flutter DevTools

DevTools поставляется с рядом обновлений с момента последнего стабильного релиза Flutter, включая улучшения UX и производительности таблиц отображения данных для более быстрой и плавной прокрутки больших списков событий (#4175).

Список обновлений с момента выхода Flutter 3.0:

Производительность

Улучшения кэша растровых изображений

Flutter 3.3 повышает производительность загрузки изображений из активов за счет устранения копий и снижения нагрузки на сборку мусора (GC) Dart. Ранее при загрузке изображений из активов API ImageProvider требовал многократного копирования сжатых данных. Сначала они копировались в кучу при открытии актива и передавались в Dart как типизированный массив данных. Затем копирование происходило во второй раз, когда этот типизированный массив данных копировался во внутреннее хранилище ui.ImmutableBuffer.

С добавлением ui.ImmutableBuffer.fromAsset байты сжатого изображения могут быть загружены непосредственно в структуру, используемую для декодирования. Этот подход требует изменений в конвейере загрузки байтов ImageProviders. Новый процесс быстрее. Он обходит некоторые дополнительные накладные расходы на планирование, которые требовал предыдущий метод загрузчика на основе каналов. Время загрузки изображений улучшилось почти в два раза в наших микробенчмарках.

Для получения дополнительной информации и руководства по миграции смотрите раздел Adding ImageProvider.loadBuffer на docs.flutter.dev.

Стабильность

Сжатие указателей в iOS отключено

В релизе 2.10 была включена оптимизация сжатия указателей в Dart на iOS. Однако Yeatse на GitHub предупредил о непреднамеренном последствии этой оптимизации. Сжатие указателей в Dart работает путем резервирования большой области виртуальной памяти для кучи Dart. Поскольку общий объем виртуальной памяти на iOS меньше, чем на других платформах, такое резервирование уменьшает объем памяти, доступный для использования другими компонентами, которые резервируют собственную память, например, плагинами Flutter.

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

Apple предоставляет полномочия, которые позволяют увеличить максимально допустимый объем виртуальной памяти для приложения, но они поддерживаются только в новых версиях iOS и не будут работать на устройствах с версиями, которые все еще поддерживает Flutter.

Улучшения API

PlatformDispatcher.onError

«На первый взгляд, очень удобный инструмент. Я думаю, что все Flutter-разработчики рано или поздно встречаются с серым экраном или серой областью при сборке релизной версии приложения. Особенно начинающим разработчикам было сложно понять и найти ошибку. Судя по документации, сейчас можно отлавливать и логировать, а также обрабатывать такие ошибки, которые показываются пользователям. Обязательно попробуем и внедрим в проекты данное обновление для улучшения анализа и более тщательной обработки ошибок».

Юрий Петров, Flutter Dev, Friflex.

В предыдущих выпусках для того, чтобы обработать все исключения и ошибки приложения, нужно было вручную настраивать пользовательские настройки Zone. Однако пользовательские настройки Zone вредили ряду оптимизаций в основных библиотеках Dart. Это замедляло время запуска приложения. В новом выпуске вместо использования пользовательских настроек Zone следует обрабатывать все ошибки и исключения путем установки обратного вызова PlatformDispatcher.onError. Здесь можно узнать больше об этом изменении: Handing errors in Flutter на docs.flutter.dev.

Изменения в FragmentProgram

Фрагментные шейдеры, написанные на GLSL и перечисленные в секции shaders: в манифесте Flutter файла pubspec.yaml приложения, теперь будут автоматически компилироваться в правильный формат, понимаемый движком, и поставляться вместе с приложением в качестве актива. Благодаря этому изменению больше не придется вручную компилировать шейдеры с помощью сторонних инструментов. В дальнейшем следует рассматривать API FragmentProgram, который принимает только результаты работы инструментария сборки Flutter. Согласно проектному документу FragmentProgram API Support improvements, это изменение запланировано на будущий выпуск.

В качестве примера этого изменения смотрите Flutter shader example.

Фрагментарное преобразование

Ранее движок Flutter Engine всегда выравнивал композитные слои по точным границам пикселей. Это улучшало производительность рендеринга на старых (32-битных) моделях iPhone. После добавления поддержки стационарных компьютеров стало заметно, что это приводит к привязке, поскольку соотношение пикселей экранных устройств обычно намного меньше. Например, на экранах с низким DPR можно было заметить, что всплывающие подсказки заметно сползают при затухании. После того, как было определено, что эта привязка пикселей больше не нужна для производительности на новых моделях iPhone, она была удалена из движка Flutter Engine для улучшения точности отображения на рабочем столе. Удаление этой пиксельной привязки стабилизировало ряд тестов «золотого изображения», которые часто менялись с небольшими различиями в рендеринге.

Изменения в поддерживаемых платформах

Прекращение поддержки 32-разрядной версии iOS

В связи с сокращением использования релиз 3.0 стал последним для поддержки 32-битных устройств iOS и iOS версий 9 и 10. Это изменение затрагивает iPhone 4S, iPhone 5, iPhone 5C, а также устройства iPad 2-го, 3-го и 4-го поколений. Стабильная версия Flutter 3.3 и все последующие стабильные выпуски больше не поддерживают 32-битные iOS-устройства и iOS версий 9 и 10. Это означает, что приложения, созданные на базе Flutter 3.3 и более поздних версий, не будут работать на этих устройствах.

Прекращение поддержки macOS 10.11 и 10.12

В стабильном релизе Q4 2022 планируется прекратить поддержку macOS версий 10.11 и 10.12. Приложения, созданные на основе стабильных SDK Flutter, больше не будут работать на этих версиях, а минимальная версия macOS, поддерживаемая Flutter, увеличится до 10.13 High Sierra.

Прекращение поддержки битового кода

Биткод больше не будет приниматься для отправки приложений для iOS в предстоящем выпуске Xcode 14, а проекты с включенным биткодом будут выдавать предупреждение о сборке в этой версии Xcode. В связи с этим Flutter откажется от поддержки биткода в одном из будущих стабильных релизов.

По умолчанию в приложениях Flutter не включен биткод.

Если биткод был включен вручную в проекте Xcode, отключите его сразу после обновления до Xcode 14. Для этого нужно открыть ios/Runner.xcworkspace и установить для параметра сборки Enable Bitcode значение No. Разработчики приложений должны отключить его в главном проекте Xcode.

Подробнее о распространении битового кода можно почитать в документации Apple.

Как вам обновление? Уже перешли на Flutter 3.3? Делитесь в комментариях.

0
6 комментариев
Написать комментарий...
Руслан М.

Статья для Хабра

Ответить
Развернуть ветку
Юрий Коршев

Я уже давно перестал заходить на Хабр из за засера основной ленты

Ответить
Развернуть ветку
Nikita Lokhov

Так а теги для кого придумали?)

Ответить
Развернуть ветку
Dmitry Myachin

Когда плюсы будет поддерживать?

Ответить
Развернуть ветку
Сергей Сергей

так вроде уже давно, если вы про ffi.

Ответить
Развернуть ветку
Dmitry Myachin

Прям без нужды создавать прослойку на C?

Ответить
Развернуть ветку
3 комментария
Раскрывать всегда