С выходом Flutter 3 на конференции I/O мы также представляем официальный выпуск стабильной версии SDK Dart 2.17. Этот выпуск был создан с учётом наших ключевых тем: лидирующей производительности и платформенной переносимости.
Dart 2.17 предлагает новые языковые возможности: поддержка членских переменных в энумах, улучшенное наследование параметров суперкласса и более гибкие именованные параметры. Мы также запустили 2.x версию пакета package:lints
, который представляет собой набор официальных правил проверки кода, основанных на лучших практиках использования Dart. В то же время были обновлены документы API основных библиотек, что позволило добавить множество примеров кода. Кроме того, чтобы улучшить интеграцию с платформой, мы предоставили новый шаблон в плагинах Flutter, использующий dart:ffi
для взаимодействия с нативными платформами через C, экспериментальную поддержку команд IRIS-V и подпись исполняемых файлов macOS и Windows.
Энумы отлично подходят для представления группы дискретных состояний. Например, можно описать воду как enum Water { замерзшая, теплая, кипящая }
. Но если нам нужно добавить методы к этому энуму, например, преобразовать каждое состояние в температуру и поддерживать преобразование энума в String
, что делать? Возможно, стоит использовать расширение методов для добавления метода waterToTemp()
, но тогда важно следить за его согласованностью с энумом. Для String
мы хотели бы переопределить метод toString()
, но это невозможно сделать.
В Dart 2.17 теперь поддерживаются членские переменные в энумах. Это позволяет добавлять поля для хранения состояния, конструкторы для установки состояния, функциональные методы и даже переопределять существующие методы. Многие разработчики сообщества давно требуют такой возможности, это третий по популярности вопрос в нашем отслеживании проблем в репозитории языка Dart.
Продолжим использовать пример с Water
. Мы можем добавить поле для хранения температуры типа int
и добавить конструктор по умолчанию, принимающий значение типа int
:
enum Water {
замерзшая(-1),
теплая(70),
кипящая(212);
const Water(this.tempInFahrenheit);
final int tempInFahrenheit;
}
Чтобы гарантировать вызов конструктора при создании значений перечисления, нам нужно явно указывать его вызов для каждого значения:```dart enum Water { frozen(32), теплая_вода(100), кипящая_вода(212);
final int tempInFahrenheit;
const Water(this.tempInFahrenheit); }
@override String toString() => "Вода ${name} имеет температуру ${tempInFahrenheit} °F.";
void main() { print(Water.frozen); // Выведет "Вода frozen имеет температуру 32 °F." }
Таким образом, вы получите полнофункциональное перечисление, которое легко инициализировать и использовать методы:
```dart
void main() {
print(Water.frozen); // Выведет "Вода frozen имеет температуру YöF."
}
Полный пример использования этих подходов показан ниже, что делает новый код более читаемым и удобным для обслуживания.
Когда ваш код использует наследование типов, одной из распространённых практик является передача некоторых аргументов конструктора родительному классу. Для этого подклассу требуется 1) указать каждый аргумент в своём конструкторе 2) использовать эти аргументы для вызова конструктора родителя. Это приводит к повторению кода, усложняя его чтение и обслуживание.
Заменил:
YöF
заменив её на правильное значение 32 °F
.Несколько участников сообщества Dart помогли реализовать эту цель языка. Шесть месяцев назад участник GitHub @roy-sianez представил языковую проблему. Его предложение было аналогично предложению участника GitHub @apps-transround: возможно, мы можем решить эту проблему, введя новое представление для указания того, что один аргумент указан в родительском классе. Мы сочли это хорошей идеей и внедрили её в версию Dart 2.17. Как видно из следующего примера, эта возможность имеет сильную связь с кодом виджетов Flutter. На самом деле, когда мы применили эту функцию к фреймворку Flutter, мы заметили, что общее количество строк кода в фреймворке уменьшилось почти на две тысячи!Наконец, мы улучшили способ вызова методов с использованием именованных аргументов. До этого обновления именованные аргументы должны были следовать за обычными аргументами. Когда вы хотели повысить читаемость кода, но столкнулись с невозможностью использовать именованные аргументы раньше, это было очень расстрошающим. Например, при вызове конструктора List<T>.generate()
. До обновления параметр growable
должен был располагаться последним, что делало его легко пропустить среди множества других параметров. Теперь вы можете располагать эти параметры в удобном порядке, начиная с именованных аргументов и заканчивая генераторами.
Для получения дополнительной информации о данных улучшениях обратитесь к нашим обновленным примерам кода для перечислений, инициализации суперкласса и использования именованных аргументов.
Перейдя к теме повышения производительности, мы внедрили ряд улучшений в основные инструменты.В Dart 2.14 мы представили пакет package:lints
, который работает вместе с анализатором Dart для предотвращения написания некорректного кода и применения более строгих правил проверки вашего кода на Dart. После этого анализатор получил множество новых правил предупреждений, которые мы тщательно отсортировали и выбрали 10 новых общих правил предупреждений для всех проектов на Dart и 2 новых специальных правил предупреждений для кода Flutter. Эти правила включают проверку корректности импорта пакетов, предотвращение неправильного использования null-проверок типовых параметров и обеспечение согласованного формата подчинённых свойств. Вы можете просто использовать команду для обновления до нового пакета lints
: - Для Dart пакета можно использовать: dart pub upgrade --major-versions lints
- Для Flutter пакета можно использовать: flutter pub upgrade --major-versions flutter_lints``SecureSockets
обычно используется для включения соединений с использованием защищённых TCP сокетов с помощью TLS и SSL. До Dart 2.17 отсутствие возможности проверять безопасность данных делало отладку этих шифрованных соединений сложной задачей во время разработки. Теперь мы добавили поддержку указания файла keyLog
, при этом каждое новое TLS ключевое значение, которое сервер обменивается с клиентом, будет записываться в формате NSS key log format. Это позволит средствам анализа сетевого трафика (например, Wireshark) расшифровывать содержимое, передаваемое через сокет. Подробнее см. раздел API документации SecureSocket.connect().Документация API, созданная с помощью dart doc
, является важным источником информации для большинства разработчиков Dart при изучении новых API. Хотя основные библиотечные API имеют полные текстовые описания уже долгое время, многие разработчики сообщили нам, что предпочитают учиться по примерам кода. В Dart 2.17 мы проанализировали все основные библиотеки и добавили подробные примеры кода для первых 200 страниц по просмотрам. Вы можете сравнить изменения между страницами документации dart:convert
в Dart 2.16 и 2.17, чтобы лучше понять эти изменения и использовать документацию API более эффективно. Улучшение производительности не ограничивается добавлением новых возможностей; удаление ненужных компонентов также играет важную роль. Мы очистили некоторые накопившиеся данные и убрали устаревшие API в SDK, что позволит нам поддерживать более компактный размер кода — особенно важно это для начинающих разработчиков. В рамках этого процесса мы удалили устаревший код с 231 строки из библиотеки dart:io
. Если вы все еще используете эти устаревшие API, вы можете воспользоваться командой dart fix
, чтобы исправить и заменить их.Кроме того, мы продолжаем работу над удалением устаревших инструментов командной строки Dart; в данном выпуске были удалены инструменты dartdoc
(замените его командой dart doc
) и pub
(используйте вместо него dart pub
или flutter pub
). ## Расширение интеграции платформ и поддержкиВторой ключевой темой является интеграция и поддержка платформ. Dart действительно является многоплатформенным языком. Хотя мы уже поддерживаем множество платформ, мы продолжаем расширяться, чтобы обеспечить глубокую интеграцию с каждой поддерживаемой платформой, а также следить за новыми платформами.
Наши основные механизмы взаимодействия с C или нативным кодом — Dart FFI — являются популярным способом интеграции Dart-кода с существующими нативными платформами. В Flutter FFI служит отличным методом для создания плагинов, использующих нативные API хост-платформы (например, Windows Win32 API). В Dart 2.17 и Flutter 3 мы добавили шаблоны FFI в инструмент flutter, что позволяет легко создавать FFI-плагины с Dart API, поддерживающими вызовы нативного кода через dart:ffi
. Подробнее см. раздел разработки пакетов и плагинов в документации разработчика.Теперь FFI поддерживает типы, специфичные для ABI, что позволяет использовать FFI на платформах с определенным ABI (Application Binary Interface)-типом. Например, теперь можно корректно представлять целочисленные значения типа Long
(C-язык long
) с размером, зависящим от ABI, который может быть как 32-, так и 64-битным в зависимости от архитектуры процессора. Полный список поддерживаемых типов см. в разделе "Implementers" страницы API AbiSpecificInteger. При использовании Dart FFI для глубокой интеграции с нативной платформой иногда требуется согласовать поведение очистки памяти или других ресурсов (портов, файлов и т. д.), выделенных в Dart, с нативным кодом. Этот вопрос долгое время был сложным, так как Dart — это язык со сборкой мусора, которая автоматически выполняет очистку. В Dart 2.17 эта проблема была решена путем введения концепции Finalizer, которая включает маркерный интерфейс Finalizable
, используемый для «маркировки» объектов, которые не должны быть слишком рано завершены или выброшены, а также класс NativeFinalizer
, который можно прикрепить к объектам Dart, чтобы обеспечивать обратный вызов при подготовке к сборке мусора. Finalizer позволяет одновременно выполнять очистку в нативном и Dart кодах. Дополнительные детали доступны в описании и примерах раздела API NativeFinalizer.HTML), а также аналогичной поддержки в Dart коде через WeakReferences и Finalizer. Поддержка компиляции Dart в нативный код также является ключевой для обеспечения отличной производительности запуска и быстрого отрисовывания приложений Flutter. Кроме того, вы можете использовать команду dart compile
, чтобы скомпилировать Dart-файлы в исполняемые файлы. Эти исполняемые файлы могут работать самостоятельно на любой машине без необходимости установки Dart SDK. Еще одним новым функционалом в Dart 2.17 является возможность подписывать исполняемые файлы, что позволяет развертывать сгенерированные продукты на платформах Windows и macOS, где часто требуется цифровая подпись.Мы продолжаем поддерживать передовые платформы и расширяем набор поддерживаемых платформ. RISC-V представляет собой новый набор команд. RISC-V International — это глобальная некоммерческая организация, которая владеет спецификациями RISC-V, делая этот набор команд свободным и открытым. Это всё ещё относительно новая платформа, но мы очень рады её потенциалу, поэтому наша версия Linux Dart 2.17.0–266.1.beta включает экспериментальную поддержку этой платформы. Мы хотели бы услышать ваш отзыв, вы можете задать вопрос или поделиться своим опытом!
Мы надеемся, что официальный выпуск Dart 2.17 поможет вам повысить эффективность работы и позволит распространять ваши приложения на большее количество платформ. Сразу же скачайте Dart 2.17 и начните его использование, а также установите Flutter 3 с встроенным Dart SDK.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )