Назад

Мобильная разработка на Flutter

Когда компания принимает решение о разработке мобильного приложения для интернет-магазина, рано или поздно возникает вопрос: нативная разработка или кроссплатформенная? И если кроссплатформенная — то Flutter или React Native?

Вокруг Flutter существовал устойчивый стереотип: хорошо для стартапов и простых приложений, но для серьёзного enterprise — нет, лучше нативный Swift или Kotlin, но этот стереотип устарел — он формировался в 2018–2019 годах, когда Flutter только появился, и с тех пор ситуация изменилась принципиально.

В этой статье разберём, как Flutter развивался, почему он технически не уступает нативным подходам, что именно он даёт в контексте разработки мобильных приложений для eCommerce — и почему репутация «фреймворка для джунов» является следствием кадровой проблемы рынка, а не архитектурным ограничением технологии.

Архитектура: почему Flutter рендерит по-другому

Ключевое архитектурное отличие Flutter от других кроссплатформенных решений — собственный движок рендеринга. Это фундаментальный выбор, который определяет всё остальное.

React Native и большинство других кроссплатформенных фреймворков работают через мост (bridge): JavaScript-код вызывает нативные компоненты платформы. Это означает, что каждое взаимодействие с UI проходит через слой трансляции между двумя средами выполнения. При сложных анимациях и высокой частоте обновления UI этот мост становится узким местом.

Flutter работает иначе. Dart-код компилируется в нативный машинный код (AOT-компиляция), а UI рендерится собственным движком Impeller напрямую на GPU, минуя нативные компоненты платформы. Flutter не просит iOS нарисовать кнопку — он рисует её сам, используя те же графические примитивы, что и нативные приложения.

Следствие: Flutter UI выглядит и ведёт себя одинаково на всех платформах не потому, что адаптируется под нативные компоненты, а потому что полностью контролирует рендеринг. Это открывает возможности для кастомных UI-решений, которые в нативной разработке потребовали бы значительных усилий.

Производительность: что говорят бенчмарки

Аргумент «нативное быстрее» звучит убедительно, но данные рисуют более сложную картину.

Startup time. В холодном старте нативные приложения исторически имели преимущество. С введением AOT-компиляции и оптимизаций в Flutter 3.x разница сократилась до уровня, неразличимого для пользователя. В тестах Google на реальных устройствах Flutter-приложения демонстрируют startup time в диапазоне 200–400 мс на современных Android-устройствах — сопоставимо с нативными аналогами.

Frame rendering. Целевая частота обновления экрана — 60 fps (и 120 fps на устройствах с ProMotion-дисплеями). Impeller демонстрирует стабильные 60 fps на сложных анимациях за счёт предварительной компиляции шейдеров, которая устраняла главную причину jank в предыдущем движке.

Размер приложения. Flutter включает собственный движок рендеринга, что добавляет к размеру итогового пакета (APK/IPA) несколько мегабайт относительно нативного аналога. Это фиксированные накладные расходы на движок — не зависящие от объёма самого приложения. На практике размер Flutter-приложений сопоставим с нативными, поскольку те нередко тянут тяжёлые сторонние SDK.

CPU при сложных операциях. Dart — однопоточный язык с event loop, но поддерживает изоляты (isolates) для выполнения тяжёлых вычислений в отдельных потоках без блокировки UI. Криптография, парсинг больших JSON-объектов, сложные вычисления — всё это выносится в изоляты, и UI остаётся отзывчивым.

Честный вывод: для мобильных приложений в eCommerce разница в производительности между хорошо написанным Flutter-приложением и нативным приложением неразличима для конечного пользователя. Там, где разница есть — она обусловлена качеством кода, а не платформой.

Кроссплатформенная мобильная разработка: что это даёт в реальных цифрах

Экономический аргумент в пользу Flutter часто формулируют упрощённо: «одна кодовая база вместо двух». Реальность сложнее, но не менее убедительна.

Объём переиспользуемого кода. В типичном eCommerce-приложении на Flutter 70–85% кода является общим для iOS и Android. Бизнес-логика, работа с API, управление состоянием, большинство UI-компонентов — всё это пишется один раз.

Платформо-специфичный код — push-уведомления, биометрическая аутентификация, платежи через Apple Pay и Google Pay — реализуется отдельно для каждой платформы, но его объём невелик. Причём зачастую этот код уже написан за разработчика: большинство таких интеграций покрывается готовыми библиотеками, включая официальные от Google. Пакеты типа local_auth, in_app_purchase, google_sign_in поддерживаются командой Flutter и регулярно обновляются под новые версии платформ. Прямое взаимодействие с нативом через Platform Channels требуется значительно реже, чем можно подумать.

Стоимость разработки. По данным различных исследований, кроссплатформенная разработка на Flutter обходится на 30–40% дешевле, чем параллельная нативная разработка двух приложений с сопоставимой функциональностью.

Стоимость поддержки. Одна кодовая база означает, что баг исправляется один раз и закрывается на обеих платформах. Новая функция реализуется один раз. Обновление зависимостей происходит один раз. Для eCommerce-приложений, которые постоянно развиваются — новые акции, новые механики, новые интеграции — это существенная операционная экономия.

Скорость выхода на рынок. Flutter-команда выпускает обновление на iOS и Android одновременно. В нативной разработке синхронизация двух команд всегда создаёт накладные расходы на коммуникацию и интеграцию.

Миф о «фреймворке для джунов»

Это, пожалуй, самый вредный стереотип вокруг Flutter — и самый легко опровергаемый.

Flutter относительно молодой фреймворк с низким порогом входа. Это означает, что на рынке много разработчиков с поверхностным знанием: они умеют собирать экраны из готовых виджетов, но не понимают архитектуру приложения, управление состоянием, оптимизацию производительности, работу с нативными платформами.

Когда такие разработчики делают проекты — получаются медленные, сложно поддерживаемые приложения. И это атрибутируется Flutter. Это та же логика, что утверждать, будто PHP — плохой язык, потому что на нём много плохого кода.

Что на самом деле требует сложный Flutter-проект:

Грамотная декомпозиция UI и UI Kit. Сложный интерфейс требует правильного разбиения на переиспользуемые компоненты. Собственный UI Kit со стилизованными виджетами, типографикой, цветовой системой и отступами — это основа масштабируемого Flutter-проекта. Без него даже небольшая команда быстро теряет консистентность интерфейса.

Архитектура управления состоянием. Для enterprise-приложений используются паттерны BLoC (Business Logic Component), Riverpod или Redux. BLoC — наиболее популярный в крупных проектах: строгое разделение UI и бизнес-логики, тестируемость, предсказуемое поведение при сложных пользовательских сценариях.

Понимание дерева виджетов и оптимизация рендеринга. В Flutter всё — виджет. Неправильно построенное дерево виджетов приводит к лишним перестройкам UI и просадкам производительности. Опытный Flutter-разработчик использует const-конструкторы, RepaintBoundary, правильно работает с keys — всё это требует глубокого понимания платформы.

Работа с изолятами. Тяжёлые вычисления — криптография, парсинг больших JSON-объектов, сложная бизнес-логика — должны выноситься в изоляты. Это не сложнее, чем работа с потоками в нативной разработке, но требует осознанного подхода.

Тестирование. Flutter предоставляет три уровня: unit-тесты, widget-тесты и integration-тесты. Отдельного внимания заслуживают Golden-тесты — сравнение скриншотов виджетов с эталонными изображениями. Это мощный инструмент для контроля визуальной консистентности, особенно при наличии UI Kit: любое случайное изменение в отрисовке компонента немедленно ловится. О Golden-тестах много спрашивают, но почти никто их не внедряет — что характеризует уровень типичных Flutter-команд на рынке, но никак не возможности самой платформы.

В доказвтельство вышеперечисленных тезисов, Nubank — один из крупнейших необанков в мире с более чем 80 миллионами клиентов — перешёл на Flutter как основную платформу для мобильной разработки. Это не история о простом приложении.

Мобильное приложение на Flutter для eCommerce: что важно специфически

Мобильное приложение интернет-магазина — один из наиболее требовательных типов приложений с точки зрения UX и производительности. Длинные списки товаров, сложные анимации переходов, работа с медиаконтентом, real-time обновление данных, интеграция с платёжными системами — всё это Flutter закрывает. 

Бесконечные списки товаров. Flutter ListView и SliverList с lazy loading корректно обрабатывают каталоги с тысячами позиций без деградации производительности. Рендеринг работает только для видимых элементов — невидимые не потребляют ресурсы.

Анимации и переходы. Hero-анимации при переходе с карточки товара на полный экран, физические анимации с корректной динамикой, кастомные переходы между экранами — всё это нативно поддерживается Flutter и работает на 60/120 fps без дополнительных библиотек.

Работа с изображениями. Кеширование через cached_network_image, прогрессивная загрузка, zoom, fit, crop, scale, наложение фильтров — стандартные задачи для eCommerce, решённые на уровне экосистемы пакетов.

Платёжные интеграции. Apple Pay, Google Pay, СБП, ЮКасса — всё реализуется через официальные SDK с готовыми Flutter-обёртками. Никаких ограничений относительно нативной разработки.

Push-уведомления. Firebase Cloud Messaging интегрируется стандартно. Rich push с изображениями, кнопками действий, deep links в конкретный раздел приложения — полная поддержка.

Биометрическая аутентификация. Face ID, Touch ID, Android Biometric API — через пакет local_auth, официально поддерживаемый командой Flutter.

Работа оффлайн. Локальное хранилище через Hive или Isar, синхронизация  при восстановлении соединения — стандартная архитектурная задача, хорошо решённая в экосистеме.

Flutter в составе Primo Commerce

В Primo Commerce Flutter является стандартным выбором для разработки мобильных приложений. Это решение вытекает из архитектуры платформы.

Magento предоставляет GraphQL API. Flutter-приложение обращается к нему через тот же API Gateway, что и веб-фронтенд. Одна кодовая база API-интеграции, один источник данных, одна бизнес-логика. Изменение в бэкенде отражается сразу в веб и мобайл без дублирования работы.

Mindbox, отвечающий за программу лояльности и маркетинговые коммуникации, имеет официальный Flutter SDK. Баллы, промо-механики, персонализированные предложения — доступны в мобильном приложении без кастомного интеграционного слоя.

Payload CMS через API предоставляет нетоварный контент — баннеры, лендинги, промо-страницы. Маркетолог обновляет контент в CMS — обновление появляется и на сайте, и в приложении одновременно.

Мобильное приложение в такой архитектуре не является отдельным проектом с отдельными интеграциями. Оно является ещё одним фронтендом единой платформы — со всеми преимуществами общей инфраструктуры данных и бизнес-логики.

Итоги

Мобильная разработка на Flutter — это зрелый, production-ready выбор для сложных eCommerce-приложений. Не потому что он модный, и не потому что дешевле. А потому что технически он закрывает те же задачи, что нативная разработка, при меньших операционных затратах на разработку и поддержку.

Репутация «фреймворка для простых проектов» — артефакт низкого порога входа и перегретого рынка, который заполнили разработчики без достаточной квалификации. Технология здесь ни при чём. Nubank, Alibaba, BMW, Google — это не простые приложения.

Грабов Максим, Оджетто.jpg

Автор статьи

Грабов Максим

Руководитель отдела продаж