Flutter или React Native: учебный выбор для команды из двух разработчиков с опытом React и TypeScript и без опыта Dart сводится к условной рекомендации. Для учебного приложения списка осмотров на Android и iOS предварительный выбор — React Native: знакомство с React и TypeScript даёт преимущество по обучению. Условие пересмотра — провал обязательной проверки платформы или библиотеки.
Что сравниваем: два фреймворка и условия доступности
Flutter — открытый фреймворк Google для нативных приложений под мобильные платформы, веб, десктоп и встраиваемые устройства из одной кодовой базы; в документации проекта сказано, что он работает с существующим кодом и распространяется свободно. Сборка идёт на C, C++ и Dart, интерфейс рисует движок Impeller, а большая часть фреймворка написана на Dart. Опыт Java, Kotlin, Swift, TypeScript или C# помогает быстрее освоить Dart и Flutter.
React Native, по документации проекта, позволяет разработчикам, знающим React, создавать нативные приложения; нативные разработчики получают паритет платформ, написав общие функции один раз. Документация рекомендует строить новое приложение через фреймворк, например Expo: он даёт файловый роутинг, универсальные библиотеки и плагины, меняющие нативный код. Без фреймворка придётся самому собирать навигацию, доступ к нативным API и работу с зависимостями.
Условия доступности функций различаются. У Flutter есть встроенные unit-, widget- и integration-тесты, DevTools, набор виджетов Material Design 3 и Cupertino, плагины для камеры, GPS, Bluetooth, сети и локального хранения. У React Native ядро функций приходит из выбранного фреймворка, и объём доступного зависит от того, какой фреймворк и какие библиотеки команда подключит.
| Критерий | Flutter | React Native |
|---|---|---|
| Язык | Dart | JavaScript/TypeScript |
| Рендеринг | Собственный движок Impeller | Нативные виджеты платформы |
| Стартовый набор | SDK с виджетами, тестами, DevTools | Фреймворк (например, Expo) с библиотеками |
| Вход для команды | Нужен Dart | Опыт React и TypeScript переносится |
| Платформы | Android, iOS, веб, десктоп, embedded | Android, iOS, TV, Web (по документации Expo) |
Исходные значения учебного набора
Учебный набор задан целиком, и его значения заданы для учебной проверки. Замер редакции не проводился. Команда: два разработчика с опытом React и TypeScript, опыта Dart нет. Целевые платформы — Android и iOS. Экраны первой версии: список осмотров, карточка осмотра, форма описания. Записи набора: I1 — насос, статус «готово»; I2 — щит, статус «ожидает». Сеть может пропадать, поэтому нужна явно спроектированная очередь синхронизации. Камера, платежи, push-уведомления и фоновая работа в первую версию не входят.
Из этого набора следуют четыре задачи: расчёт обучения команды, проверка библиотеки локального хранения, проверка очереди синхронизации и план сборок обеих платформ. Скорость и стоимость без измерений не оцениваются, неизвестное выносится в список проверок.
Учебный вход (условные значения, не измерение):
Команда: 2 разработчика, React + TypeScript, без Dart
Платформы: Android, iOS
Экраны v1: список осмотров, карточка осмотра, форма описания
Записи: I1 — насос, статус «готово»; I2 — щит, статус «ожидает»
Сеть: может пропадать → нужна очередь синхронизации
Вне v1: камера, платежи, push, фоновая работа
Заполненная матрица выбора
Матрица заполнена по условиям набора, и в ней есть явно помеченное неизвестное.
| Критерий | Flutter | React Native | Статус |
|---|---|---|---|
| Обучение команды | Потребуется изучить Dart | Опыт React и TypeScript переносится | Преимущество у React Native |
| Платформы Android и iOS | Поддерживаются | Поддерживаются | Оба соответствуют целям |
| Локальное хранение | Требует выбранной реализации | Требует выбранной реализации | Не проверено |
| Очередь синхронизации | Требует выбранной реализации | Требует выбранной реализации | Не проверено |
| Сборка под Android | Есть | Есть | Проверяется планом сборок |
| Сборка под iOS | Есть | Есть | Проверяется планом сборок |
Строка «обучение» решает исход при равных остальных условиях: команда уже знает React и TypeScript, а Dart ей предстоит освоить. Строки «локальное хранение» и «очередь синхронизации» помечены как непроверенные, и именно они способны перевернуть выбор. Пока проверка не пройдена, рекомендация матрицы остаётся предварительной.
Условная рекомендация и условие пересмотра
Предварительный выбор — React Native, и он основан на опыте именно этой команды. Документация проекта прямо говорит, что React Native создан для разработчиков, знающих React, а Flutter требует Dart, хотя опыт TypeScript и помогает его освоить. Для учебного проекта с тремя экранами и двумя записями это преимущество по обучению оказывается решающим.
Условие пересмотра одно: провал обязательной проверки платформы или библиотеки. Если выбранная библиотека локального хранения не собирается под одну из целевых платформ, или очередь синхронизации не проходит проверку, рекомендация теряет силу. Тогда команда возвращается к матрице и пересматривает выбор.
Смена навыков на Dart снимает преимущество React Native по обучению, но не обязывает выбирать Flutter. Это значит, что появление в команде разработчика с Dart меняет расстановку в первой строке матрицы, а остальные строки остаются непроверенными до выполнения плана.
Эталон данных и две обязательные проверки
Эталон данных задаёт, что считается правильным результатом. После перезапуска приложения записи I1 и I2 сохраняют ID и статус: насос остаётся «готово», щит — «ожидает». Два открытия формы описания не создают дубликаты.
Проверка первая — сохранение ID и статуса после перезапуска. Порядок: создать I1 и I2, закрыть приложение, открыть снова, сверить идентификаторы и статусы с эталоном. Проверка вторая — отсутствие дубликатов при двух открытиях формы. Порядок: открыть форму описания, открыть её повторно, сохранить запись, проверить, что в списке появилась ровно одна запись и дубликат отсутствует.
Чек-лист эталона (проверяет читатель):
[ ] После перезапуска I1 сохраняет ID и статус «готово»
[ ] После перезапуска I2 сохраняет ID и статус «ожидает»
[ ] Два открытия формы описания дают одну запись
[ ] Повторный запуск не меняет идентификаторы
Обе проверки выполняются на выбранном стеке и на обеих платформах. Результат фиксируется как пройдено или не пройдено, без оценки скорости.
План проверки читателя
Этот план выполняет читатель на своём стенде. Он отделён от учебного набора: набор задаёт вход, план задаёт действия. Ни один пункт не считается выполненным заранее.
Порядок действий:
- Создать проект на выбранном стеке и подключить библиотеку локального хранения.
- Реализовать запись I1 и I2 с полями ID и статус.
- Реализовать очередь синхронизации с явным поведением при пропаже сети.
- Прогнать чек-лист эталона на Android.
- Прогнать чек-лист эталона на iOS.
- Зафиксировать результат каждой проверки.
Если пункт 4 или 5 не проходит, срабатывает условие пересмотра выбора. Результаты записывает читатель после своего запуска; редакция эти проверки не проводила.
Локальное хранение и очередь синхронизации
Локальное хранение и очередь синхронизации — две отдельные задачи, и общее утверждение о поддержке их не заменяет. Библиотека хранения отвечает за запись и чтение записей I1 и I2 на устройстве. Очередь синхронизации отвечает за отправку изменений при появлении сети и за порядок операций.
Проверка библиотеки хранения: записать I1 и I2, перезапустить приложение, прочитать записи, сверить ID и статусы. Проверка очереди: отключить сеть, изменить статус записи, включить сеть, убедиться, что изменение ушло один раз. Обе задачи проверяются на Android и iOS отдельно.
В документации Flutter сказано, что экосистема пакетов на pub.dev поддерживает локальное хранение и облачные сервисы. В документации React Native выбор библиотек приходит вместе с фреймворком. Конкретную библиотеку команда выбирает сама, и до проверки её статус остаётся неизвестным.
План сборок и расчёт обучения
План сборок строится для обеих платформ. У Flutter сборка идёт командой flutter create для проекта и flutter run для запуска; создание проекта сразу готовит файлы для Android и iOS. У React Native документация проекта предлагает начать с npx create-expo-app@latest, а окружение без фреймворка настраивается через Android Studio и Xcode.
План сборок (проверяет читатель):
Android:
[ ] Собрать debug-сборку
[ ] Установить на устройство или эмулятор
[ ] Прогнать чек-лист эталона
iOS:
[ ] Собрать debug-сборку
[ ] Установить на симулятор или устройство
[ ] Прогнать чек-лист эталона
Расчёт обучения команды опирается на уже известное: React и TypeScript освоены, Dart — нет. В документации Flutter отмечено, что опыт TypeScript помогает учить Dart быстрее, а сам Dart описан как объектно-ориентированный язык с C-подобным синтаксисом. Точные сроки обучения зависят от команды и здесь не назначаются.
Границы первой версии
Камера, платежи, push-уведомления и фоновая работа остаются вне первой версии и на выбор не влияют. В документации Flutter перечислены плагины для камеры, GPS, Bluetooth, сети и локального хранения, а также облачные сервисы для аутентификации, уведомлений, платежей и хранения. Наличие этих возможностей в экосистеме не означает, что они входят в первую версию учебного проекта.
Границы заданы явно: три экрана, две записи, локальное хранение и очередь синхронизации. Всё остальное откладывается до следующей версии. Такой набор позволяет проверить выбор на малом объёме и не смешивать его с задачами, которые к выбору отношения не имеют.
Частые вопросы
Flutter или React Native — что выбрать для учебного проекта?
Для команды с опытом React и TypeScript предварительный выбор — React Native: знакомство с React даёт преимущество по обучению. Flutter потребует изучить Dart. Рекомендация условная и пересматривается при провале обязательной проверки платформы или библиотеки.
Почему рекомендация условная?
Локальное хранение и очередь синхронизации у обоих кандидатов требуют выбранной реализации, и их статус не проверен. Пока проверка не пройдена, выбор остаётся предварительным. Условие пересмотра — провал проверки платформы или библиотеки.
Как проверить эталон данных?
После перезапуска записи I1 и I2 должны сохранить ID и статус: насос — «готово», щит — «ожидает». Два открытия формы описания не должны создать дубликаты. Проверки выполняются на Android и iOS отдельно.
Нужно ли оценивать скорость и стоимость?
Скорость и стоимость без измерений не оцениваются. Все неизвестные выносятся в список проверок. Точные сроки обучения команды зависят от неё самой и здесь не назначаются.
Что остаётся вне первой версии?
Камера, платежи, push-уведомления и фоновая работа в первую версию не входят и на выбор не влияют. Первая версия включает список осмотров, карточку осмотра и форму описания с локальным хранением и очередью синхронизации.
