Расскажи про свой путь в разработке на Flutter

Ответ

Мой путь в разработке начался с общего интереса к созданию мобильных приложений. После экспериментов с нативным Android (Kotlin) я открыл для себя Flutter в 2019 году. Решающим фактором стала его кроссплатформенность и невероятно быстрый цикл разработки благодаря Hot Reload.

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

Первый коммерческий проект: Попал в стартап, где мы разрабатывали приложение для фитнес-трекинга. Здесь я глубоко погрузился в:

  • Управление состоянием: Прошел эволюцию от setState к Provider, а затем к Riverpod, который сейчас предпочитаю за его compile-time безопасность и простоту тестирования.
  • Работу с API: Использовал dio с интерсепторами для логирования, автоматического добавления токенов авторизации и обработки ошибок в едином стиле.
  • Нативные интеграции: Писал каналы (MethodChannel) для интеграции специфичных для платформы функций, таких как работа с датчиком NFC на Android и HealthKit на iOS.

Текущий фокус и стек: Сейчас я работаю в команде над крупным коммерческим приложением. Мой основной стек и интересы:

  • Архитектура: Внедряем Clean Architecture с четким разделением на слои (Data, Domain, Presentation). Используем Riverpod для инъекции зависимостей и управления состоянием.
  • Производительность: Регулярно провожу профилирование через Dart DevTools (в частности, Performance и Memory вкладки), оптимизирую ребилды виджетов, работаю с ListView.builder и const конструкторами.
  • Качество кода: Пишем unit и widget тесты с flutter_test и интеграционные тесты. Используем flutter_gen для типобезопасной работы с ассетами.
  • Инструменты: Работаю с Firebase (Auth, Cloud Firestore, Cloud Functions), GitLab CI/CD для автоматизации сборки и деплоя в App Store Connect и Google Play Console.

Пример подхода к структуре проекта:

lib/
├── src/
│   ├── features/          # Фичи, организованные по модулям
│   │   └── auth/
│   │       ├── data/      # репозитории, модели данных, источники
│   │       ├── domain/    # use cases, entities, репозитории (интерфейсы)
│   │       └── presentation/
│   │           ├── widgets/
│   │           ├── notifiers/ # StateNotifier'ы (бизнес-логика)
│   │           └── screens/
│   ├── core/             # общие утилиты, константы, DI
│   └── shared/           # общие виджеты

Постоянно изучаю новые подходы, например, сейчас исследую возможности Flutter 3.x с Impeller и углубляюсь в Dart для бэкенда (например, с shelf или Aqueduct).

Ответ 18+ 🔞

А, слушай, вот как я в эту движуху влип. Начиналось всё с простого любопытства — хотелось приложения для телефона делать. Поковырял нативный Android на Kotlin, конечно, но потом, в 2019-м, наткнулся на Flutter. И тут, бля, меня как током долбануло — кроссплатформенность же, ёпта! И этот самый Hot Reload, когда ты изменяешь код, а приложение обновляется на эмуляторе мгновенно, без пересборки. Это же просто волшебство, ядрёна вошь! Терпения ноль ебать на ожидание сборки, а тут — чих-пых и готово.

Первые шаги: Начал, как все нормальные люди, с официальной документации. Делал эти учебные приложения-клоны: погода там, список задач. Чтобы просто понять, как эти чёртовы виджеты друг в друга вкладываются, как состояние работает и что этот Dart за язык такой со своей асинхронностью. В общем, набивал шишки.

Первый коммерческий проект: Потом занесло в стартап, делали приложение для фитнес-трекинга. Вот тут-то и началась настоящая, блядь, работа. Пришлось глубоко нырять:

  • Управление состоянием: Прошёл весь этот адский путь. Начинал с простого setState, который для маленьких проектов ещё куда ни шло, но когда логика растёт — это пиздец, чувак, всё рассыпается. Потом пересел на Provider — уже лучше. А сейчас вот всей душой за Riverpod, потому что у него compile-time безопасность и тесты писать — одно удовольствие. После Provider'а это как небо и земля.
  • Работу с API: Взял dio за основу. Напилил кучу интерсепторов: один логирует все запросы-ответы (для отладки — вещь незаменимая), другой автоматом цепляет токен авторизации в заголовки, третий ловит все ошибки от сервака и приводит их к единому виду, чтобы на UI нормально отобразить. Без такого подхода — просто мрак.
  • Нативные интеграции: Вот это была, бля, песня. Пришлось лезть в натив. Писал эти каналы (MethodChannel), чтобы на Android датчик NFC зацепить, а на iOS — HealthKit. Чувствовал себя каким-то шаманом, который заставляет два разных мира разговаривать. Сам от себя охуевал, когда всё заработало.

Текущий фокус и стек: Сейчас вкалываю в команде над одним крупным коммерческим проектом. Тут уже совсем другие масштабы и требования.

  • Архитектура: Внедряем Clean Architecture. Чёткое разделение: Data, Domain, Presentation. Каждый слой знает своё место. Для инъекции зависимостей и состояния — Riverpod. Когда проект большой, без строгой архитектуры — просто овердохуища проблем, ты утонешь в хаосе.
  • Производительность: Регулярно сижу в Dart DevTools, особенно во вкладках Performance и Memory. Слежу, чтобы лишние виджеты не перестраивались почём зря, везде, где можно, const ставлю, ListView.builder для длинных списков использую. Если за этим не следить, приложение начнёт тормозить и жрать батарею как не в себя.
  • Качество кода: Пишем тесты. Unit, widget. Без этого сейчас никуда. Ещё flutter_gen подключили — чтобы работа с картинками и шрифтами была типобезопасной. Раньше опечатку в строке с названием файла можно было искать полдня, а теперь IDE сразу подскажет.
  • Инструменты: Работаем с Firebase (Auth, Cloud Firestore, Cloud Functions). Для сборки и выкатки настроили GitLab CI/CD. Автоматически собирает, тесты гоняет и заливает билды в App Store Connect и Google Play Console. Рутину машине отдали, голова меньше болит.

Пример подхода к структуре проекта: Вот как у нас внутри примерно всё устроено:

lib/
├── src/
│   ├── features/          # Фичи, разбитые по модулям
│   │   └── auth/          # Допустим, всё про авторизацию
│   │       ├── data/      # тут репозитории, модели, источники данных (API, локальная БД)
│   │       ├── domain/    # ядро: юзкейсы, ентити, интерфейсы репозиториев
│   │       └── presentation/ # всё для UI
│   │           ├── widgets/ # мелкие переиспользуемые виджеты
│   │           ├── notifiers/ # StateNotifier'ы, где живёт бизнес-логика экрана
│   │           └── screens/   # сами экраны, сборные из виджетов
│   ├── core/             # общие штуки: роутинг, утилиты, константы, настройка DI
│   └── shared/           # общие виджеты, типа кнопок, полей ввода

И постоянно, бля, что-то новое изучаю. Сейчас вот щупаю Flutter 3.x, смотрю, что там за зверь такой — Impeller. И Dart для бэкенда присматриваю, на shelf или Aqueduct. В общем, скучать не приходится, ебать копать.