Шлях у світ Flutter: найкращі пакети для початківців

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

Всім привіт! Мене звати Ігор, я працюю Flutter-розробником в компанії Anadea. Розробники, які тільки починають працювати з Flutter, часто мають складнощі у виборі пакетів, тож цей матеріал має полегшити їм життя.

Отже ви починаєте працювати з Flutter і стикаєтеся з вибором з понад 33,000 пакетів на Pub.dev. Вічне питання: на які з них варто витратити свій час? Вибір може бути складним, тому давайте розіб’ємо цю масу на частини.

Ця стаття присвячена пакетам, які я використовую на практиці у своїй роботі та вважаю їх must have для ознайомлення Flutter-розробником. Я розділив їх на основні категорії, а також пропоную альтернативи. Буду радий побачити пропозиції з доповнення цього списку в коментарях.

Статтю також можна прочитати англійською.

Які пакети Flutter можна вважати найкращими

Які у нас критерії? В кінцевому підсумку «найкраще» — це суб’єктивне поняття. Ось що я оцінюю:

  • сумісність з останньою стабільною версією Flutter;
  • підтримка AndroidX (так, це все ще важливо, хоча і стає нормою за замовчуванням);
  • універсальність для багатьох платформ (Web, iOS, Android і т. д.);
  • покриття тестами: як інтеграційними, так і модульними;
  • якісна документація (хто має час розшифровувати погану документацію?);
  • активне обслуговування: часті оновлення та активне комʼюніті — ось ключ до успіху.

Отже з критеріями визначилися. Перейдімо до справи!

Управління станом

Flutter_bloc — це бібліотека передбачуваного управління станом для Dart, яка є простою, високоякісною та добре протестованою.

Бібліотека дозволяє:

  • переконатися у поточному стані програми в будь-який момент. Проводити комплексні тести, щоб переконатися, що програма реагує так, як очікувалося;
  • документувати кожну взаємодію користувача у вашій програмі для ухвалення рішень на основі даних.
  • оптимізувати ефективність за допомогою повторного використання компонентів в межах та між різними програмами;
  • сприяти плавній співпраці між кількома розробниками за допомогою стандартних шаблонів та конвенцій;
  • Прискорювати розробку застосунків.

Альтернатива

Riverpod — бібліотека управління станом для Flutter, яка спрощує доступ до стану, зберігаючи водночас його надійність та можливості для тестування.

Мережеві операції

Chopper — це генератор клієнта HTTP для Dart і Flutter за допомогою source_gen. Він спрямований на спрощення та очищення викликів API за допомогою генерації коду.

Chopper побудований на основі пакету HTTP, що означає, що він підтримує всі ті ж методи HTTP (GET, POST, PUT, DELETE і т. д.) та опції, що й пакет HTTP. Однак Chopper полегшує написання чистого, організованого коду для викликів API у застосунках Flutter.

Альтернатива

Retrofit — генератор клієнта dio для конвертації типів за допомогою source_gen і натхненний Chopper.

Генератор коду та інструменти збірки

Json Serializable надає конструктори для Dart Build System для створення коду, який перетворює в JSON і з JSON шляхом анотування класів Dart. Щоб позначити клас як серіалізований, ви повинні анотувати його за допомогою @JsonSerializable().

Freezed дозволяє визначати незмінні класи у Dart чисто і легко. Позначивши клас анотацією, Freezed генерує всі необхідні шаблони для перетворення класу в дані з методами fromJson, toJson та всіма іншими необхідними методами.

Хоча Freezed корисний, його слід використовувати свідомо, оскільки він може спричинити довгий час збірки у великих проектах. Із цього потім випливає дискусія, чи треба комітити згенеровані файли Freezed, але це вже обирає кожна команда окремо.

Ефективна робота з двома останніми типами бібліотек та їхня користь прекрасно продемонстрована у DOU Livecoding з Анною Леущенко.

Інʼєкція залежностей

GetIt — це простий ServiceLocator для Flutter, який допомагає вам отримувати доступ до сервісних об’єктів, як-от клієнти REST API або бази даних, щоб їх легко можна було мокувати, а також доступу до BLoCs з Flutter Views. З його простим налаштуванням та незалежністю від генерації коду Get_it став слушним варіантом для розробників, які шукають простий та легкий підхід до керування залежностями.

Injectable — це зручний генератор коду для Get_it. Зазвичай ця пара рухається завжди разом.

База даних

База даних ObjectBox — це чудовий варіант для зберігання об’єктів Dart у кросплатформеній програмі. Вона створена для високої продуктивності. ObjectBox використовує мінімальні ресурси CPU, пам’яті та батареї, роблячи вашу програму ефективною.

Зберігаючи дані локально на пристрої, ObjectBox допомагає знизити витрати на хмарні сервіси та створювати програму, яка не залежить від підімкнення до мережі. Розпочати роботу з інтуїтивно зрозумілим інструментом на основі мови Dart можна за кілька хвилин, без необхідності побудови SQL-запитів.

Альтернатива

Drift — потужна та гнучка бібліотека SQLite для розробки Dart та Flutter. Вона дозволяє розробникам працювати з базами даних за допомогою мови Dart в безпечний та інтуїтивний спосіб. З Drift розробники можуть створювати та взаємодіяти з базами даних, використовуючи виразні можливості мови Dart, як-от async/await та потоки.

Навігація

AutoRouter — це пакет навігації Flutter, який дозволяє передавати аргументи зі строго типізованим підходом та легко створювати глибокі посилання, використовуючи генерацію коду для спрощення настройки маршрутів, із цим необхідно мінімальне кодування для створення всього необхідного для навігації у вашому застосунку.

Пакет останнім часом втратив перше за популярністю місце, але для мене однаково залишається стандартом.

Альтернатива

go_router — декларативний пакет маршрутизації для Flutter, який використовує API маршрутизатора для надання зручного, заснованого на URL API для переходу між різними екранами. Ви можете визначати шаблони URL, навігувати за допомогою URL, оброблювати глибокі посилання та низку інших сценаріїв, пов’язаних з навігацією.

Локалізація

Slang — це бібліотека, що характерна своїми мінімальними вимогами до налаштувань. Вона спрощує створення файлів JSON для перекладу, не потребуючи складних налаштувань. Особливо цей інструмент важливий у запобіганні помилок завдяки перевірці під час компіляції, він забезпечує практично неможливість помилок під час введення, що підвищує надійність коду.

Він дозволяє розділити великі файли перекладу на менші компоненти за допомогою просторів імен, а це сприяє зрозумілості коду та його підтримці.

Альтернатива

Easy_localization — не лише допомагає з локалізацією, але й підтримує локалі множини, роду, вкладеності та напряму. Він підтримує методи розширення для віджетів Text і BuildContext для легкого перекладу. Він також реагує на зміни локалі.

Висновок

Екосистема пакетів Flutter є обширною та постійно змінюється завдяки відданій спільноті розробників. Цей список ні в якому разі не є остаточним; він базується на моєму досвіді та вимогах, з якими я стикався у проєктах розробки Flutter-застосунків. Ваш власний проєкт може вимагати інших рішень, і це абсолютно нормально. Експерементуйте та знаходьте оптимальні варіанти для себе!

Поширенні питання

Чому важливо обирати правильні пакети Flutter

Вибір правильних пакетів Flutter має вирішальне значення, оскільки це безпосередньо впливає на якість, підтримку та ефективність вашого застосунка. Правильні пакети забезпечують сумісність з останніми версіями Flutter, підтримку на різних платформах (як-от Android, iOS та Web), а також надійну функціональність з високим покриттям тестами.

Вони також мають гарну документацію та активну спільноту, що є важливим для усунення неполадок та забезпечення довгострокової життєздатності.

Як пакети поліпшують розробку застосунків Flutter

Пакети Flutter поліпшують розробку застосунків, надаючи готовий, перевірений та надійний код для різних функцій. Це заощаджує час та зусилля розробників під час написання коду з нуля. Пакети, як-от Flutter_bloc для управління станом, Chopper для мережі та ObjectBox для зберігання даних, оптимізують певні аспекти розробки застосунків.

Вони дозволяють розробникам фокусуватися на створенні унікальних функцій свого застосунка, а не вигадувати велосипед для стандартних функцій.

Як ефективно навігувати в екосистемі пакетів Flutter

Під час навігації в екосистемі пакетів Flutter варто враховувати наступні поради:

  • досліджуйте: досліджуйте сумісність кожного пакета, його історію обслуговування та відгуки спільноти;
  • тестуйте на придатність: експерементуйте з кількома пакетами в тестовому проєкті, щоб переконатися, наскільки добре вони інтегруються з вашим застосунком та відповідають вашим конкретним потребам;
  • будьте в курсі: екосистема Flutter швидко розвивається, тому важливо бути в курсі нових та оновлених пакетів;
  • розглядайте альтернативи: завжди шукайте альтернативні пакети, які можуть краще пасувати для потреб вашого проєкту, оскільки один пакет не є універсальним для всіх рішень.
👍ПодобаєтьсяСподобалось17
До обраногоВ обраному11
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Я в своїх пет-проєктах довгий час використовував easy_localization, але зараз переповзаю на стандартний flutter_localizations. Подобається, що він генерує код і тексти можна вибирати з автодоповнення. Це також захищає від одруківок при написанні текстів. До того ж arb-файли більш інформативні, ніж звичайний json.

А чому go_router — альтернатива? Я б поставив його на перше місце, як загальноприйнятий. Водночас, за Riverpod згодний — це на той випадок, коли Bloc/Provider не працюють.

Блок то якась бойлерплейтна бiда)

А пробували Bloc+Freezed ?

Так.
Нічого особливо не змінюється.

auto_router на першому місці для мене через більше комʼюніті, та і для початківця буде більше семплів та прикладів. Можливо з часом вони поміняються місцями)

Звісно зміниться.
ГоРоутер дефолт для флаттеру, той же хендлінг діплінків в офф доці на го роутері.

Вибір може бути складним

Та не такий вже він і складний. По-перше, є позначки Flutter Favourite, по-друге рейтинг Popularity. Тобто дивимося на перше і друге, і або шукаємо щось інше, якщо пакет якийсь невідомий, або якщо пакет дуже потрібний, то вивчаємо код, що там є. Ось і все.

Нажаль обидва пункти не завжди спрацьовують. Флаттер тіма не дає ачівку Flutter Favourite якщо має свій пакет альтернативу, а Popularity може отримати не найкращий пакет (

Чи є бажаючі доєднатись до пет проєкту реалізації нового концепту на flutter?
Шукаємо 2-3 людини junior+/middle рівня.
Разова символічна компенсація після завершення тим хто дійде до релізу, яскравий запис в резюме. Можливість найму після залучення інвестицій.

Стартап ttravel.me

Додав би ще flutter_screenutil для зручності адаптивної верстки

Дружище — ты как минимум забыл про GetX и Nylo если мы говорим про популяризацию флаттера

так, підтримую, треба було додати у кінці статті речення типу: якщо вам треба швидко і аби як, після вас хоч потоп, то замість майже всього що вище можна юзати комбайни типу GetX та Nylo.

Я например видел кашу-лапшу из bloc-provider и не раз и такую что забыть про флаттер хочется. Поэтому GetX, Nylo надо хотя бы попробовать на проекте от полугода а потом сравнить с остальными решениями

Була навіть серія тредів у твіттерку де топові люди у флаттер пояснювали що ГетИкс то не є добре

на пабе у GetX 13.4K у блока 6.2K у провайдера 9.3K надо смирится что флаттер это разные подходы и флаттер может быть многообразным.А просто так хейтить что то или вытаскивать единичные мнения это не правильно.Красота в многообразии

Існувати гетіксу ніхто не заважає
Як і будь якому іншому гівнокоду
Але треба розуміти що юзати, а що краще ні.

Є навіть відос на ютубі де розбирають гетікс, але він російянський, тому публікувати лінку не буду.
В кінці гетікс програє по всім параметрам.

Если бы флаттер был идеально сделан то никаких гетиксов, блоков, риверподов не понадобилось бы. Поэтому надо смириться с многообразием подходов и идей

Йой, най буде.
Хоча б для того щоб можна було показати як не треба робити

GetX не обісрав тільки той хто його не юзав)

GetX особисто я вважаю поганим вибором, комбайн який обєднує в собі все не може бути пакетом який я порекомендую. Він є популярним через швидкість розгортання, але на практиці я не зустрічав та не чув про жоден якісно написаний проект з використанням GetX. Проте кожна команда сама обирає свій технічний стек)

Раджу глянути Signals.dart. Вона ще маловідома ця бібліотека, але я думаю, що може в майбутньому потіснити блок через свою легкість та простоту використання.

не тягніть своє js гуано у наш прекрасний Flutter!!!

Пишуть верстку класами
@
прекрасний Flutter

Але ж не тягнем свої поробки у ЖС)))

зате «верстку» можна дебажити == ставити брекпойнти на верстку і точно знати чого ти бачиш на екрані те що ти бачиш )

На мою думку краще використовувати go_router

тому шо він від флаттер тіми
Не дивлячись на те що автороут живе — він може в будь-який момент зачинитися.(як це часто буває у екосистемі сторонніх бібліотек флаттеру)

Обидва пакета повністю виконують свої функції, auto_route старше і тому його комьюніті більше. Тут як з chopper та retrofit обидва пакети дуже схожі і можна обирати на свій смак)

Так)
Але опесорс в одне лице це не надійно, якщо є більш стабільні альтернативи — нажаль автороут програє.

Ми зараз на версії 5 автороуту і будемо мігрувати на го роутер саме через ризики.

Василю, як мігруєте — поділіться досвідом, чи воно того вартувало.

Важко буде сказати.
Тому що ми не використовуємо якісь унікальні фічі. З пʼяток роутів та і все.
В нас просто була стара версія автороуту
Тому мігрувати на 7 чи на го роутер — однаково по часу.
Зваживши за та проти — вирішили взяти го роутер, бо був неприємний досвід коли автороут заглох на пів року.
Легко пересвідчитись глянувши на історію версій

— 3.2.2 — 24 міс назад
— 3.2.1 — 2 роки тому

Спонсорів у ліби не видно.
До того ж на гітхабі була дивна практика коли не активні ішью помічались не активними та зачинялись без жодні відповіді.

Тому це вибір не за фічі, а скоріше від гріха подалі.

Дякую за згадку про мій воркшоп 💙

І дякую за корисний матеріал! В моєму must-have списку також є згадані json_serializable, freezed, retrofit (і відповідно, dio), auto_router, get_it із injectable, та flutter_bloc. На додачу, я завжди використовую i69n для локалізації, flutter_gen для управління ресурсами, і bdd_widget_test для тестування.

Все ніяк руки не дійдуть спробувати bdd_widget_test, виглядає пакет дуже цікаво.

Підписатись на коментарі