Починаємо з конкретної ситуації. Клієнт приносить концепт агрегатора таксі: три ролі, real-time оновлення, карти, фонові геодані. Вимога — 60 fps навіть на бюджетних пристроях і деплой у сторах без зауважень. Flutter тут закриває 80% завдань, але на краях — BLE, фонові завдання, нативні SDK — просадка за часом до 30%, якщо не знати підводних каменів. Ми знаємо ці камені — за 8 років у мобільній розробці накопичили досвід десятків проєктів. Оцінимо ваш проєкт безкоштовно за два дні.
Як Flutter знижує бюджет розробки?
Порівняння з роздільною розробкою на Swift і Kotlin: Flutter дає економію 30–50% за рахунок єдиної кодової бази, однієї мови та меншої кількості багів на межі платформ. За даними Google, Flutter випереджає React Native за відсотком пропущених кадрів на 15–25%. На реальному проєкті з 200k записів у локальній БД різниця між isar і hive склала ~3x на фільтрації — цифри, а не обіцянки. Зниження витрат на розробку порівняно з нативом досягає 1.5–2 разів.
Де Flutter виграє, а де потрібна обережність
Кроссплатформенний підхід виправданий, коли UI-логіка однакова на iOS і Android, а продукт потрібен швидко. Flutter закриває 80–90% потреб через стандартні віджети Material і Cupertino. Проблеми починаються на краях.
Платформозалежні API. Bluetooth Low Energy — через flutter_blue_plus, але його поведінка на Android 12+ (коли Google змінила дозволи з ACCESS_FINE_LOCATION на BLUETOOTH_SCAN) вимагає окремої обробки. На iOS — окремий ключ NSBluetoothAlwaysUsageDescription у Info.plist плюс фоновий режим bluetooth-central. Пропустите — App Store відхилить за guideline 5.1.1.
Background execution. Dart Isolates не вирішують проблему фонових завдань на рівні ОС. Для фонової геолокації — background_locator_2 + WorkManager на Android. На iOS — CLLocationManager у режимі allowsBackgroundLocationUpdates. Тут Flutter дає лише тонку обгортку, реальна логіка — нативна.
Platform channels. Коли готового плагіна немає, пишемо MethodChannel або EventChannel. Типовий кейс — інтеграція з POS-терміналом через SDK виробника (Ingenico, PAX): SDK доступний тільки у вигляді .aar для Android і .framework для iOS, обгортаємо в нативний код, пробрасовуємо через канал. Тут «кроссплатформенність» закінчується рівно на межі channel.
Як ми будуємо архітектуру?
Для проєктів від п'яти екранів використовуємо чисту архітектуру з розділенням на data, domain, presentation. State management — Riverpod 2.x (провайдери типу AsyncNotifierProvider замість застарілого ChangeNotifierProvider). BLoC застосовуємо там, де команда вже з ним працювала або потрібен строгий event-driven flow з тестованістю кожного стану.
Навігація — go_router 13.x з підтримкою deep links і веб-маршрутизацією (якщо Flutter Web потрібен). Старий Navigator 1.0 уникаємо — при складних вкладених маршрутах стек ламається непередбачувано.
DI — через get_it + injectable. Генерація коду через build_runner скорочує boilerplate, але вимагає дисципліни: freezed для immutable-моделей, json_serializable для серіалізації, drift або isar для локальної БД. isar у версії 3.x показує відчутно вище hive на операціях з колекціями — в одному проєкті з 200k записів різниця склала ~3x на фільтрації.
Приклад з практики. Додаток агрегатора таксі — три користувацькі ролі (пасажир, водій, диспетчер), real-time оновлення через WebSocket (web_socket_channel), карти через flutter_map + OpenStreetMap тайли (клієнт економив на Google Maps SDK). Фонові оновлення геопозиції водія — через WorkManager на Android і BGAppRefreshTask на iOS з обгорткою в Dart. Складання релізу — Fastlane + GitHub Actions: один workflow збирає --release APK і IPA паралельно, підписує, завантажує в Firebase App Distribution для QA.
Порівняння підходів до управління станом:
| Підхід | Продуктивність | Складність | Тестованість |
|---|---|---|---|
| Riverpod 2.x | Висока | Середня | Висока |
| BLoC | Висока | Висока | Висока |
| Provider | Середня | Низька | Середня |
Тестування та CI
Unit-тести Dart — стандартний flutter_test. Integration-тести — integration_test package (запуск на реальному пристрої або емуляторі через flutter drive). Widget-тести покривають ключові компоненти: testWidgets з WidgetTester і pump/pumpAndSettle.
У CI (GitHub Actions / GitLab CI) розділяємо: flutter analyze + dart format --set-exit-if-changed на кожен PR, тести — паралельно на Android API 33 emulator і iOS Simulator. Складання під TestFlight і Google Play Internal Track — через Fastlane Match для сертифікатів.
Продуктивність профілюємо в flutter run --profile + DevTools: Timeline view показує jank-фрейми (>16ms), Memory view — heap між rebuild-ами. Типові проблеми: надлишкові setState у глибокому дереві, неоптимізовані зображення (декодуємо без cacheWidth/cacheHeight), дорогі обчислення в build() замість винесених у compute().
Що входить у роботу
- Технічне завдання та архітектурна документація
- Розробка UI та бізнес-логіки на Dart
- Інтеграція з REST/GraphQL API та нативними сервісами
- Налаштування CI/CD через GitHub Actions (автоматичні збірки, підпис, деплой)
- Підготовка до публікації в App Store та Google Play (усунення зауважень рев'ю)
- Навчання команди замовника та 2 місяці підтримки після релізу
Типові помилки при самостійній розробці
Найчастіше бачимо три проблеми при аудиті Flutter-проєктів від інших команд.
-
Неправильна архітектура провайдерів.
ChangeNotifierз глобальним станом, який перебудовує весь екран на будь-яку зміну. Перехід наRiverpodз гранулярнимиselect-ами знімає проблему, але вимагає рефакторингу. -
Platform channel без error handling. Нативний код кидає виняток → канал падає → додаток крашиться без зрозумілого повідомлення. Всі виклики через
MethodChannelобгортаємо вtry/catch PlatformException. -
Ігнорування ізолятів для важких операцій. JSON-десеріалізація 10MB відповіді на main isolate дає помітний фриз.
compute()або ручнийIsolate.spawn— обов'язково для даних >1MB.
Терміни та вартість
| Масштаб проєкту | Орієнтовні терміни |
|---|---|
| MVP, 5–10 екранів, REST API | 6–10 тижнів |
| Середній продукт, 15–30 екранів, offline-режим | 3–6 місяців |
| Складний продукт: real-time, платежі, карти, BLE | 6–12 місяців |
Вартість розраховується індивідуально після аналізу вимог. Зв'яжіться з нами для консультації — оцінимо проєкт протягом двох робочих днів. Наша команда — 8 років досвіду в мобільній розробці, понад 50 успішних проєктів на Flutter, сертифіковані Flutter-розробники. Гарантуємо дотримання термінів та прозору звітність на кожному етапі. Замовте оцінку проєкту — це безкоштовно.







