Компания Very Good Ventures провела исследование и опубликовала рейтинг самых важных пакетов в экосистеме Dart и Flutter.
Рассказываем, какие пакеты вошли в топ — от независимых разработчиков, компаний и сообщества.
Как проводилось исследование
На pub.dev опубликовано более 55 000 пакетов. Они помогают разработчикам с задачами от provider до http.
Чтобы выделить самые ценные пакеты и понять, какие из них требуют особого внимания, в 2020 году Google предложил метрику под названием «Оценка критичности». В ее основе лежит формула, которая выглядит так:
Cpkg=∑αi1i∑αi⋅log(1+max(Si,Ti))log(1+Si)
Si — значение метрики (сигнала) для конкретного пакета. Это может быть количество звезд на GitHub, число активных контрибьюторов или частота обновлений.
αi — вес каждой метрики. Он отражает ее важность для оценки критичности. Например, если для нас важнее всего частота обновлений, ее вес будет выше, чем у других сигналов
max(Si,Ti) — максимальное значение для сигнала. Если сигнал превышает определенный порог Ti, его вклад в критичность больше не увеличивается. Это нужно, чтобы исключить слишком большой разброс значений и учесть только действительно критические значения.
(log(1+Si)\log(1 + S_i)log(1+Si)) — логарифм, который уменьшает вклад больших значений, чтобы они не перекрывали другие сигналы. Например, если у одного пакета 10000 звезд, а у другого — 1000 звезд, разница в 10 раз кажется огромной. Но пакет с 10000 звезд не в 10 раз важнее пакета с 1000.
Наконец, формула нормализует каждый сигнал относительно его порогового значения max(Si,Ti). Это позволяет получать значения в диапазоне от 0 до 1 и делает оценку более стабильной и независимой от роста числа пакетов в экосистеме.
Алгоритм измеряет показатели репозитория, а не пакета. Напомним разницу: репозиторий — это контейнер для кода и его истории, а пакет — единица кода, которая предназначена для повторного использования.
В исследование попали пакеты на pub.dev, которые были правильно ассоциированы с репозиторием на GitHub и Dart-репозиториями.
Пакеты от независимых разработчиков
1. flutter_rust_bridge — делает проще взаимодействие между приложениями и кодом, написанным на Rust.
flutter_rust_bridge интегрирует код на Rust с приложениями на Flutter. Rust известен своей безопасностью и производительностью. Он подходит для приложений, которым критически важны стабильная работа и безопасность данных.
Пакет автоматизирует рутинные задачи, например, сериализацию и десериализацию данных и поддерживает асинхронные вызовы. Благодаря ему приложения становятся более отзывчивыми.
Пакет регулярно обновляется. У него солидная документация и активное сообщество, которое помогает начинающим разработчикам.
2. riverpod — управляет состоянием в приложениях. Riverpod разделяет логику управления состоянием и виджеты. Это упрощает структуру кода и делает его более читаемым.
API Riverpod предлагает инструменты для работы с асинхронными данными и потоками и подходит для приложений, которые требуют обработки данных из сети или других источников.
Riverpod легко расширяется и настраивается под задачи приложения. Он часто обновляется, и у него простая документация.
3. bloc — управляет состоянием приложения, в котором используется архитектурный паттерн BLoC.
BLoC помогает разделить бизнес-логику и пользовательский интерфейс. Паттерн использует потоки, чтобы управлять состоянием — они помогают быстро реагировать на изменения данных. Это важно для приложений с динамическим контентом.
BLoC также хорошо подходит для сложных приложений с множеством состояний и взаимодействий. У него развитая экосистема с документаций, библиотеками, полезным контентом.
4. freezed — делает проще работу с неизменяемыми классами и генерацией boilerplate-кода.
Пакет упрощает создание неизменяемых (immutable) классов. Он помогает избегать ошибок, которые связаны с изменением состояния объектов. Freezed автоматически генерирует методы для копирования объектов с изменением полей. Работа с состоянием становится безопаснее.
Пакет позволяет создавать объединения (sealed classes), которые могут представлять несколько разных состояний. Это особенно полезно для работы с состоянием в приложениях и обработкой разных сценариев.
Freezed автоматически генерирует методы toString(), hashCode и упрощает работу с объектами. Для сериализации Freezed интегрируется с библиотекой json_serializable, с ним легко преобразовывать объекты в JSON и обратно.
Freezed делает код декларативнее и понятнее. Пакет полностью поддерживает нулевую безопасность (null safety) Dart. Он хорошо интегрируется с другими популярными библиотеками в экосистеме Flutter, такими как Riverpod и BLoC.
5. drift — предназначен для работы с локальными базами данных. Пакет предлагает простой API для работы с SQLite. Поддерживает реактивные потоки данных, что позволяет автоматически обновлять пользовательский интерфейс, когда меняются данные в реальном времени.
Пакет использует статическую типизацию, что позволяет ловить ошибки на этапе компиляции. Код становится надежнее, а отладка — проще.
Drift снижает объем шаблонного кода и упрощает разработку. Позволяет использовать сложные SQL-запросы: объединения, подзапросы и агрегации.
У Drift есть удобные инструменты для управления миграциями базы данных. В экосистеме пакета есть понятная документация, инструкции и гайды по работе с ним.
Drift считается универсальным инструментом для управления состоянием и данными, потому что легко интегрируется с другими популярными библиотеками в экосистеме Flutter, такими как Provider и Riverpod.
6. flutter_inappwebview — создан для интеграции веб-контента в приложения на Flutter. Пакет дает набор функций для работы с веб-контентом, в том числе поддержку JavaScript, управление куками, доступ к заголовкам HTTP.
flutter_inappwebview использует нативные компоненты WebView, что обеспечивает высокую производительность и плавную работу контента. Пакет позволяет взаимодействовать с нативными API. Это упрощает интеграцию веб-контента с функциями устройства.
flutter_inappwebview предлагает множество разных событий, таких как загрузка страницы или изменение URL. С его помощью легко отслеживать состояние веб-контента и реагировать на изменения в нем.
Разработчики могут настраивать внешний вид и поведение WebView. Например, добавлять пользовательские кнопки, меню, другие элементы интерфейса.
7. archive — предназначен для работы с архивами файлов, ZIP и TAR. API пакета можно легко интегрировать в проекты. Он не требует дополнительных зависимостей. Благодаря небольшому размеру пакет можно использовать в мобильных приложениях.
archive пригодится, когда нужно обрабатывать большие файлы и потоки данных в реальном времени.
8. get — помогает управлять состоянием, маршрутизацией и зависимостями. У пакета лаконичный синтаксис и минималистичный подход. Благодаря гибкости и масштабируемости GetX можно использовать и для небольших проектов, и для крупных приложений.
get также отличает хорошая документация и активное сообщество, которое помогает новичкам.
9. chopper — упрощает работу с HTTP-запросами, предлагает структурированный способ создания RESTful API-клиентов.
Chopper предоставляет удобный интерфейс для работы с RESTful API. Он легко интегрируется с разными форматами данных. Например, SON или XML.
Chopper поддерживает плагины, поэтому к нему можно добавлять другие функции, например, обработку ошибок, авторизацию, кэширование. Пакет хорошо работает в связке с другими популярными библиотеками, такими как Dio и Retrofit.
10. file_picker — предназначен для выбора файлов и папок на устройствах пользователей. У пакета удобный интерфейс для работы с файловой системой.
file_picker позволяет выбирать файлы, директории, поддерживает фильтрацию по типам файлов.
Пакет легко интегрируется с другими библиотеками и инструментами, например, image_picker. Разработчики могут увеличивать количество функций в приложениях. Например, можно настроить внешний вид и поведение диалогов, когда выбираешь файлы.
Пакеты от компаний
1. sentry — мониторит ошибки в приложениях. Легко интегрируется с GitHub, Slack и Jira. Пакет позволяет получать в реальном времени уведомления об ошибках. Можно настроить уведомления по разным критериям. Например, по самым критичным ошибкам.
Sentry не только отслеживает ошибки, но и собирает данные о производительности приложения, по которым можно выявлять узкие места и оптимизировать код.
2. stream_video_flutter — предлагает инструменты для работы с видео в реальном времени. Пакет используется в приложениях с видеозвонками, стримингом видео или другими интерактивными видеосервисами.
У пакета простой API для работы с потоковым видео, поэтому с ним могут работать разработчики с минимальным опытом. Внешний вид и поведение видеоплеера можно настраивать. stream_video_flutter интегрируется с сервисом Stream, который предлагает разные возможности для работы с видео и чатом в реальном времени.
Пакет поддерживает сообщество разработчиков, поэтому у него хорошая документация и есть примеры интеграции. stream_video_flutter регулярно обновляют и улучшают.
3. flutter-permission-handler — упрощает управление разрешениями. Библиотека поддерживает разные платформы, включая Android и iOS. flutter-permission-handler запрашивает и проверяет разрешения на доступ к камере, микрофону, местоположению и другим функциям телефона.
Чтобы интегрировать управление разрешениями в приложение, с этим пакетом не нужны глубокие знания особенностей платформ. Библиотека позволяет не только запрашивать разрешения, но и проверять их статусы.
4. patrol — автоматизирует тестирование приложений на Flutter. Пакет позволяет писать и выполнять тесты, которые имитируют взаимодействие пользователя с приложением.
5. melos — управляет проектами с несколькими пакетами. Melos упрощает работу с монорепозиториями и предлагает инструменты для автоматизации рутинных задач, таких как сборка, тестирование и публикация пакетов.
Библиотека синхронизирует зависимости между разными пакетами, делает управление версиями проще и уменьшает вероятность конфликтов. Melos — полезная находка для командной работы. Можно быстро вносить изменения в разные пакеты и отслеживать изменения в них.
Пакет быстро интегрируется в процессы CI/CD. Тестирование и развертывание приложений проходит в автоматическом режиме.
6. supabase — предлагает инструменты для создания бэкенда и управления данными. Часто рассматривается как альтернатива Firebase, но с акцентом на использование SQL и открытых стандартов.
Supabase основан на PostgreSQL. Supabase обеспечивает высокую производительность и его легко масштабировать для приложений разного размера. Благодаря SDK для Dart supavase можно быстро интегрировать с приложениями на Flutter.
7. amplify_flutter — интегрирует облачные сервисы AWS в мобильные и веб-приложения. Пакет создавался как часть экосистемы Amazon Web Services (AWS). Amplify предлагает набор инструментов для разработки приложений, включая аутентификацию, API (GraphQL и REST), хранение файлов.
У SDK Amplify для Flutter удобные API, поэтому интегрировать облачные функции в приложение сможет и новичок. Приложения на Amplify можно быстро масштабировать благодаря AWS в качестве бэкенда. Это важно для растущих проектов.
8. flutter-geolocator — дает доступ к функциям геолокации на мобильных устройствах.
У geolocator простой API для работы с геолокацией. Пакет определяет местоположение, помогает отслеживать его изменения и получать данные о скорости движения.
Пакет использует GPS, Wi-Fi и мобильные сети. geolocator хорошо работает с другими популярными пакетами Flutter, например, google_maps_flutter.
flutter-geolocator часто обновляется. У него понятная и обширная документация. Сообщество разработчиков регулярно публикует способы решения разных проблем, отвечает на вопросы новичков.
9. flutter_stripe — предлагает интеграцию с популярной платежной платформой Stripe. Пакет поддерживает разные способы оплаты. Он регулярно обновляется и легко интегрируется с последними версиями Flutter и Stripe.
Начинающие разработчики могут быстро начать работу с flutter_stripe благодаря понятной документации и руководствам с наглядными примерами.
10. at_server — помогает разрабатывать децентрализованные приложения. Удобные API упрощают хранение и извлечение информации. at_server легко интегрируется с другими сервисами и библиотеками. Пакет позволяет работать с данными в режиме реального времени.
Пакеты от сообщества
1. plus_plugins — набор плагинов дает доступ к функциям и API на мобильных платформах iOS и Android. Помогает разработчикам интегрировать нативные функции в приложения без кода на нативных языках.
plus_plugins активно поддерживается сообществом. Его регулярно обновляют, исправляют ошибки, добавляют новые функции. Пакет легко интегрируется с другими инструментами и библиотеками Flutter.
2. Flame — игровой движок предлагает набор инструментов и библиотек, которые делают разработку 2d-игр проще и обеспечивают высокую производительность.
Интуитивно понятный API движка позволяет быстро начать разработку и не требует глубоких знаний. Flame построен на основе Flutter и использует преимущества фреймворка: горячую перезагрузку, виджеты, анимацию. Возможности рендеринга Flutter обеспечивают высокую производительность.
Flame предлагает много модулей и плагинов, чтобы добавлять в игры звуковые эффекты и другие функции.
У Flame активное сообщество разработчиков, которое регулярно публикует документацию, примеры кода, отвечает на вопросы.
3. dio — библиотека упрощает взаимодействие с RESTful API. Библиотека поддерживает асинхронные операции, что делает ее идеальной для работы с сетевыми запросами без блокировки основного потока приложения.
Среди функций dio — поддержка разных методов HTTP: GET, POST, PUT, DELETE.
dio помогает обрабатывать ответы, включая автоматическое преобразование JSON. Поддерживает отмену запросов. Это полезно в ситуациях, когда пользователь покидает экран или приложение. С Dio можно легко настраивать заголовки, параметры и таймауты для каждого запроса.
А еще библиотека поддерживает интерцепторы, которые позволяют перехватывать запросы и ответы. Это полезно, когда нужно добавить токены аутентификации или обработать ошибки.
4. audioplayers — позволяет воспроизводить аудиофайлы и управлять ими. Библиотека поддерживает асинхронные операции. Это значит, что можно записывать и воспроизводить аудио без блокировки основного потока приложения.
Сообщество развивает audioplayers, поэтому у библиотеки понятная документация, много примеров работы, руководств, регулярные обновления.
5. photo_manager — дает доступ к фотографиям и видеозаписям на устройствах пользователей.
photo_manager поддерживает асинхронные вызовы. Это значит, что основной поток приложения не будет блокироваться.
Разработчики библиотеки регулярно ее обновляют, добавляют новые функции и исправляют ошибки. Документация и примеры помогают быстро разобраться с функциями библиотеки и интегрировать ее в свои проекты.
Согласны с результатами исследования? Делитесь своим мнением в комментариях!