Программирование с ИИ
ENRU
14.4

Кейс — мобильное приложение

тот же API, другой разговор

Что это

Четвёртый потребитель того же API: приложение на Flutter. По смыслу экран тот же, что в статье 14.3, — список городов с температурой, — но разговор с ИИ получается другим, и различия стоит увидеть рядом.

Шаг 1. Что меняется в мини-ТЗ

Три строки по сравнению со статьёй 14.2 — и каждая тянет за собой работу:

Адрес API. localhost в приложении на телефоне указывает на сам телефон, а не на твою машину. При разработке нужен адрес машины в локальной сети, на боевом — настоящий домен. Это первое, обо что спотыкаются, и ИИ об этом не предупреждает, потому что не знает, где ты запускаешь.

Сеть пропадает. У сайта это редкость, у телефона — норма (статья 11.5). Значит, последние данные надо хранить на устройстве и показывать их с пометкой «обновлено тогда-то», а не пустой экран.

Обновление не мгновенное. Сайт обновляется при перезагрузке страницы, приложение — когда пользователь согласится (статья 12.3). Значит, API не может ломать совместимость: поле temp останется temp навсегда.

Шаг 2. Запрос

Лучше
Flutter 3.38, Dart 3.10. Состояние — provider 6,
других библиотек состояния не добавлять.

Один экран: список городов с температурой.
Данные: GET http://<адрес>/cities,
ответ [{"name": String, "temp": double?}].

Нужно:
- модель City с fromJson, без приведения типов,
  temp честно nullable
- четыре состояния: загрузка, ошибка, пусто, данные
- адрес API вынести в настройку, не вшивать
- проверить вёрстку на ширине 360 и с длинным названием

Сначала список файлов и что в каждом. Код после «да».

Сравни с запросом из статьи 14.3: половина строк совпадает дословно. Четыре состояния, явные типы, адрес в настройке — это не свойства React или Flutter, а свойства задачи «показать данные из сети». Поэтому хороший запрос переносится между стеками почти целиком.

Отличаются три вещи, и все три — про платформу: версии (здесь их называют обязательно), библиотека состояния и проверка на узком экране.

Шаг 3. Что проверять в ответе

Поскольку запустить нельзя, остаётся то, что можно прочитать. По порядку важности:

1. Версия API. Главная проблема стека (статья 11.2). Устаревшие имена виджетов и параметров; flutter analyze обычно находит.

2. !, late, dynamic в разборе JSON. Сервер может ответить ошибкой, и json['temp'] as double уронит приложение. В модели должно быть честное double? и проверка, а не приведение типа.

3. Четыре состояния — все ли. Самое частое: есть «данные пришли», нет остального.

4. Запросы в build. Поход в сеть принадлежит слою данных, а не методу построения (статья 11.4).

5. dispose у контроллеров. Забытая уборка.

6. Фиксированные размеры. Переполнение на узком экране.

Это тот же список, что в статье 11.6, — здесь он просто применён к конкретной задаче.

Шаг 4. Разговор, который стоит завести заранее

Запрос
Я собираюсь выпустить это приложение в магазин.
Перечисли, что надо решить до первой публикации
и что после неё поменять уже нельзя.

Ответ на этот вопрос разобран в статье 12.2, и он ровно та причина, по которой мобильный кейс стоит планировать дольше остальных: сайт переделывается за вечер, а идентификатор приложения — никогда.

Шаг 5. Честный итог

Из четырёх потребителей API (бот, сайт, приложение, скрипт) этот — самый дорогой: отдельный стек, отдельная сборка, отдельная публикация, невозможность откатиться. При этом экран у него тот же, что у сайта.

Вопрос, который стоит задать себе до начала, а не после: нужно ли это приложение, или хватит сайта, открытого на телефоне? Для списка городов с температурой ответ чаще «хватит сайта». Приложение оправдано, когда нужно то, чего у сайта нет: работа без сети, уведомления, камера, фоновая работа.

Это и есть архитектурное решение из главы 13 — то самое, которое ИИ примет за тебя, если не принять его самому.

Шпаргалка

  • Хороший запрос переносится между стеками почти дословно.

  • Различается только платформенное: версии, библиотека состояния, узкий экран.

  • localhost в телефоне — это сам телефон, а не твоя машина.

  • У мобильного приложения сеть пропадает постоянно: нужны прошлые данные.

  • Старые версии приложения живут долго — API не может ломать совместимость.

  • Читать ответ по списку из статьи 11.6: версия, !/late, состояния, build.

  • Перед мобильным кейсом честно ответь, нужен ли он: сайт дешевле во всём.