Новое в Dart
В основном, вектор обновления направлен на развитие в сторону взаимодействия с JS и компиляцией в WebAssembly. Представили новый пакет для взаимодействия с Web API — package:web. Является новым способом для интеграции с js для Dart проектов. Миграция на этот пакет привнесет очень вкусный бонус — компиляция в WebAssembly. А секретом нового пакета является новая фича языка — extension type.
Extension type
Обёртка над указанным типом, которая имеет доступ к его методам и полям. Позволяет добавлять свои методы (переопределить методы можно тоже). Является compile-time объектом, который не имеет затраты на выделение типа, как написание обычного враппера.
Выглядит примерно так:
|
|
Пример инициализации:
|
|
Повторять документацию я не вижу смысла, поэтому вот краткий список фич, которые умеют extension type:
- Конструкторы
- Поддерживаемые поля (функции, геттеры, сеттеры, операторы)
- Имплементация типа
- Переопределение поля
Но остановлюсь более подробно на 3 и 4 пункте.
Имплементация типа позволяет сделать так, что наш тип будет равен тому же типу, над которым мы пишем обёртку. Это удобно, например, для создания объекта Money:
|
|
Как вы заметили, здесь нет математических операторов. Вся логика для этого класса будет равна логике при работе с обычным числом, поэтому её можно опустить:
|
|
А теперь перейдем к грязи — @redeclare
аннотация (package:meta). В extension type нельзя переопределить (@override
) какое-то поле, поддерживая связь с родителем через super.method
. Нам дали новую аннотацию, с помощью которой поведение функции меняется на новую:
|
|
То есть, мы можем переопределить для себя какие-то поля, и они будут отрабатывать согласно нашему новому типу. Но если какой-то метод будет запрашивать тип, над которым мы делали обёртку — то использовать он будет напрямую тип, а не обёртку. Это защищает от кейсов, когда автор библиотеки сделал final class
, и ожидает одно поведение от метода класса, а мы написали обёртку, в которой метод будет возвращать совершенно другое значение. Dart умный, и всё взаимодействие у автора библиотеки будет происходить только с его классом.
Но если вы у себя в проекте сделаете что-то подобное, то главное не утоните в слоях пост-иронии и самообмана.
|
|
В заключение этой фичи, хочу сказать, что она предназначена для достаточно узких кейсов, либо когда функционал нового типа во многом повторяет какой-либо существующий. Но в то же время, это очень полезный инструмент для работы с JS. Возможно, в будущем комьюнити найдет более интересные способы применения этой конструкции.
Полезные ссылки:
Новое во Flutter
Улучшения
- Несжатый Flutter Engine теперь весит на 350KB меньше.
- Оптимизация блюра до 70%, в зависимости от сложности UI
- Google Maps и лупа в TextField теперь работают в TLHC режиме, обеспечивая лучшую производительность
Android
- В DevTools добавлена секция “Deep Link”, которая поможет проверить правильность настройки deeplinks. От себя добавлю, что в Android Studio тоже можно проверять запуск ссылок с помощью инструмента “App Links Assistant”.
- Контекстное меню, которое появляется после выбора текста, теперь поддерживает другие установленные приложения в системе. Например, при выделении номера, будет предложено открыть его в приложении “Телефон”. Также добавлена кнопка “Поделиться”, которая в Android-native отображается по умолчанию.
- Добавлена поддержка Android OpenGL в Impeller (до этого был только Vulkan). Это значит, что почти все устройства на Android, теперь поддерживаются Impeller. Чтобы потыкать новый движок, используйте эту статью.
iOS
- Системный шрифт теперь следует Apple Human Design: чем меньше размер шрифта, тем больше глифы удалены друг от друга; и наоборот — чем больше шрифт, тем ближе глифы находятся друг к другу.
- Flutter теперь содержит Privacy Manifest, согласно новым требованиям Apple.
- Прекращена поддержка iOS 11
Windows
- Прекращена поддержка Windows 7, Windows 8
- Добавлена поддержка Windows arm64
Важное
- Флаг
Paint.enableDithering
удалён. Он был включен глобально уже много версий назад, а также проблема, которую он решал, была устранена.
Roadmap
Разработчики поделились с нами планами на 2024 год, и там очень много вкусного:
- Skia на iOS будет полностью убрана. На Android Impeller станет основным, но Skia можно будет включить по необходимости.
- Фреймворк перейдет полностью на Material 3, Material 2 со временем будет удалён. Я настоятельно рекомендую переводить ваши проекты на Material 3 и правильно настраивать тему. Используя Material 2, вы ограничиваете себя от новых виджетов, например IconButton.filled.
- Команда также ожидает вернуться к работе над Blackcanvas — проект, который позволит разработчикам создавать свои отдельные UI наборы с нуля. Проблема в том, что все существующие UI пакеты наследуются от Material, и редко от Cupertino. Разработчики хотят внести улучшения, чтобы подобные пакеты не зависели от уже существующих UI наборов.
- В Web продолжат пилить оптимизацию, хотят сделать CanvasKit рендером по умолчанию. Но самое интересное — поддержка platform view и компиляция в WebAssembly. Также, возобновляется работа над Hot Reload в вебе (сейчас приложение перезапускается при вызове Hot Reload).
- Поддержка platform views на macOS и Windows, которая позволит встраивать, например, WebView. На Linux приоритет добавить GTK4. И на всех платформах ведется работа по мультиоконному режиму в рамках одного Dart изолята и одного дерева виджетов. Первые превью этой фичи уже были на канале Flutter!
- В этом году в Dart ожидают решить, насколько поддержка метапрограммирования целесообразна, и либо выпустить первые этапы поддержки этой фичи, либо же отказаться вовсе. Метапрограммирование (или же макросы) — это что-то типа генератора кода внутри самого кода. В основном, комьюнити ждет эту фичу, чтобы писать сериализацию/десериализацию дата классов. Для такого случая рассматривают возможность добавления ValueClasses.
- Обсуждают интересные фичи для сокращения написания кода, например: структы или сокращенные импорты
- В этом году будет 4 стабильных релиза и 12 беток.