Як я пишу Flutter-додаток для обліку батарей і обслуговування девайсів (BatDev)
Привіт. Мене звати Артем і я фулстек девелопер із основною спеціалізацією Drupal.
Відносно нещодавно почав вивчати Flutter для втілення своїх ідей в сфері мобільної розробки і хочу поділитися досвідом розробки цікавого додатку.
З чого все почалось
Після минулої зими у мене «померла» батарея електросамоката, а зарядна станція стала вимикатись коли на дісплеї було ще ~20%. Формально я знав, що
Так з’явилась ідея BatDev — додатку менеджменту пристроїв з батареями, де по кожному девайсу завжди видно поточні статуси (використання / зберігання / обслуговування), історію, нотатки (ємність, пробіг на заряді тощо). Ну і головне — нагадування про обслуговування згідно рекомендаціям виробника.

Чому не Google Calendar і не «ще один todo»
Перша думка була доволі проста: поставити нагадування в календарі. Але вона швидко відпала.
У календарі немає моделі даних під девайс: тип батареї, інтервал у днях, прив’язка до статусу «на зберіганні», історія періодів, нотатки з датами. Для мене ключове було не «нагадати раз», а вести стан пристрою в часі: коли був у роботі, коли в зберіганні, коли робилось обслуговування — і з цього вже автоматично рахувати «коли наступне». Вести це вручну, коли девайсів десятки — для мене це просто пекло.
В голові одразу виникла ідея мобільного додатку. Якраз влітку я почав цікавитись і вивчати Flutter. Щоб не створювати «велосипед» я звісно перешерстив плеймаркет в пошукуів хоч чогось схожого по різним ключовим словам. Результат — тільки купа додатків для менеджменту батареї телефону. Тому я вирішив імплементувати ідею самостійно з активним використанням штучного інтелекту.
Стек (навмисно простий)
- Flutter / Dart
- один код під Android зараз, iOS пізніше.
- Isar (isar_plus) — локальна БД:
Device,DeviceState,Note. - http + session cookie до власного API на Drupal (каталог категорій/моделей, типи батарей, переклади UI)
- Без Firebase Auth/Firestore на цьому етапі: дані користувача живуть на телефоні; синхронізація на бек — окремий наступний етап.
Архітектурно розбив на модулі: add_device, device_list, device_page, notifications, settings, плюс _common (моделі, ApiClient, БД). Це не «enterprise», але допомагає не змішувати UI форми додавання з логікою нотифікацій.

Модель даних: статуси важливіші за «чекбокс обслужив»
Найважливіше і націкавіше саме для мене — історія. Це як з машиною — хочется знати коли було пройдено останє ТО, що коли мінялось, як часто ламається та чи інша деталь. На основі цих даних можна робити висновки о надійності авто, а можливо і о його продажу якнайшвидше.
Тому замість одного поля lastMaintenance я зберігаю весь ланцюжок періодів з певним статусом:
state: 1 — активне використання, 2 — зберігання, 3 — обслуговування;startDate— початок періоду; кінець = старт наступного запису.
Так простіше будувати timeline / «графік використання» і рахувати рекомендовану дату обслуговування саме для режиму зберігання (якір — старт зберігання або останнє обслуговування + maintenance_interval у днях).
Окрема «колекція» — нотатки з датою: тут ми можемо писати будь які данні на певну дату в звичайному текстовому форматі.
Спочатку я планував поле «реальна ємність» де можна було б записувати ємність батареї і потім будувати графік старіння акумулятору і т.ін. Проте не завжди і не на всіх девайсах можна виміряти залишкову ємність. Тим більше якщо треба точно.
Тоді я думав зробити «відносну ємність» бо для якихось девайсів можна порахувати Аг чи Вт*г, а для інших гарний показник час роботи пристрою від одного заряду чи кількість накатаних кілометрів.
Проте знову ж таки, буває що треба записати ще якісь допоміжні данні — напругу на ячейках, чим заряджали, як зберігали і т.п. Саме тому я вирішив зупинитись на простоті — текстові нотатки з прив’язкою до дати, щоб через рік було з чим порівняти.

Локалізація не через arb-файли, а через API
Звертаючи увагу, що перевірка реліз білду в гугл-плей може займати тиждень, була мета — додавати нові локалізації в додаток без створення нового білду. Тож питання транслейшенів винесено на сторону бекенду. В друпал через кастомний модуль додаємо потрібні строчки та переклади з контекстом «mobile_app» (щоб не плутатитись з перекладами з ядра).
При старті додатку UI-рядки тягнуться з /{lang}/api/translation, а список достпупних мов — з /api/translations. Каталог кешується локально (SharedPreferences), щоб перший кадр не чекав мережу.
Що робив з AI (Cursor), а що лишалось «головою»
Писав/рефакторив багато з асистентом: форми add/edit, міграція API-ключів, Isar-схема, autocomplete моделей. Корисно на рутині й на «пройдись по rename скрізь».
Але рішення «що є джерелом правди» (локальна БД vs Drupal catalog), як моделювати статуси, що синхронізувати пізніше без картинок — це все одно продуктові/архітектурні вибори. AI добре виконує план; погано сам вирішує, який план правильний, якщо йому згодувати рекламний опис замість обмежень.
Що свідомо ще не зроблено
- синхронізація девайсів користувача на бекенд — було б досить зручно на випадок перевстановлення додатку, заміни телефону і т.п. щоб додаток підтягував минулі девайсі і їх історію статусів. Можливо буде в майбутніх версіях;
- iOS — хочу максимально відкатати додаток на Андроїд, зібрати відгуки і проаналізувати доцільність виходу на iPhone, бо Аппстор — це нова для мене тема, ще й щорічний девелоперський збір. Тож треба продумати й модель монетизації;
- повне наповнення каталогу моделей — наповнення буде йти по ходу роботи додатку. Почну з популярних моделей зарядних станцій, в перспективі додати більш широкий спектр відомих моделей (повербанки, LiFePO4 акумулятори, самокати і т.д.);
- публічний реліз у Play — наразі додаток перебуває у стадії закритого тестування і доступний за посиланням лише для учасників групи раннього доступу. Тож доєднуйтесь до групи і встановлюйте додаток.
На тесті повний функціонал без реклами — не як «маркетингова акція», а щоб швидше зібрати реальні сценарії, отримати цінні відгуки та наповнити каталог девайсів.
Висновки на зараз
- Для такого продукту важливіша модель часу (статуси/інтервали), ніж красивий список девайсів.
- Чим простіше, тим краще — онлайн каталог популярних моделей девайсів, кастомні нотатки на дату.
- При плануванні архітектури слід продумати збільшення функціоналу, кількості девайсів, додавання перекладів без необхідності постійного оновлення продакшен релізу.
- Closed testing корисний саме як інженерний етап для збору відгуків, побажань і можливих багів.
- AI — значно економить час і може допомогти в написанні коду, проте найважливіші архітектурні рішення саме за вами. І нести відповідальність чи відчувати наслідки цих рішень будете саме ви )
Задавайте питання, озвучуйте ідеї в коментарях.
Хто хоче отримати ранній доступ і доєднатися до закритого тестування на Android доєднуйтесь до групи після чого встановлюйте додаток BatDev з гугл-плей. До кінця цього року в планах виход і на IPhone.
Бажаю, щоб ваші зарядні станції та ліхтарики не знадобились вам цієї зими, проте не забувайте про вчасне обслуговування, щоб бути напоготові!
P.S. Далі ще декілька скріншотів для загального розуміння ідеї і функціоналу додатку.




6 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівObjectBox, Hive
Isar — підарський пакет. База побудована на libmdb, який підтримується підаром з росії який потрапив до миротворця і зашкварен роботою з підсанкційними компаніями. Саймону (автору ісара) абсолютно все одне на це, він вважає «опенсорс внє палітікі».
Про це AI не згадував при виборі пакету в якості БД.) Чи є нормальні альтернативи?
Drift, але це не носкл, це гнучкий орм над SQLite.
Також є realm, але там питання по майбутній підтримці. Він скоріше мертв ніж жив.
Можливо, є сенс одразу рухатись в firestore.
та вже давно нема особливо понту не йти до клаудів, ну гуглові сервіси топ, хоч і не самі дешеві на масштабі, але на такого розміру апках — ідеально взагалі, там ллмки вже самі вміють майже все що треба в фаербейзі робити
я розумію шо на пет проекті все простіше з вибором стека. але не завжди можна покласти все в гугл/авс.
до речі, там серверпод шось рожає для клауда і автосінку.