Мобильное приложение для Android, позволяющее отслеживать котировки акций и индексов с Yahoo Finance, строить графики с техническими индикаторами и получать уведомления при достижении ценой заданных пороговых значений. Проект разработан как учебный pet-project полного цикла. Цель — продемонстрировать навыки работы с локальными базами данных, интеграцией внешних API, фоновыми процессами и построением пользовательского интерфейса без использования сторонних библиотек графиков (кастомная отрисовка).
Приложение построено по паттерну MVVM-like (Model-View-ViewModel/Service) с разделением ответственности:
- Client Framework: Flutter 3.x + Dart 3.x
- State Management: Provider / StatefulWidget logic (в зависимости от сложности экрана)
- Networking: dio (HTTP client) с кастомными интерцепторами для обработки ошибок и ретраев.
- Local Database: sqflite (SQLite wrapper for Flutter). Схема БД включает таблицы для кэша свечей, котировок, правил алертов, групп и связей "многие-ко-многим". Реализована система миграций (версии схемы 1–5) для безопасного обновления структуры БД без потери данных пользователя.
- Background Tasks: workmanager plugin. Используется двухуровневая стратегия: периодические задачи (страховочные) и цепочки одноразовых задач (основные) для балансировки между энергопотреблением и скоростью реакции.
- Native Integration: MethodChannel для взаимодействия с системными настройками Android (автозапуск, оптимизация батареи) на устройствах производителей с агрессивной экономией энергии (Xiaomi, Huawei и др.).
lib/
├── main.dart # Точка входа, инициализация сервисов
├── data/ # Слой доступа к данным
│ ├── local_db.dart # Работа с SQLite
│ ├── yahoo_provider.dart # HTTP-клиент для Yahoo Finance
│ └── indicators.dart # Чистые функции расчета индикаторов
├── models/ # Классы моделей данных (DTO)
├── screens/ # Экраны приложения (UI)
├── services/ # Бизнес-логика (алерты, онбординг)
└── widgets/ # Переиспользуемые компоненты (график, списки)
Так как проект использует неофициальные источники данных и работает в фоне, были приняты следующие меры:
- Реализованы повторные попытки запросов (retry) с экспоненциальной задержкой.
- Эмуляция браузерных заголовков (User-Agent) для снижения вероятности блокировки.
- Graceful degradation: если расширенные данные недоступны, приложение продолжает работать с базовыми котировками.
- Проблема: многие оболочки Android убивают фоновые службы для экономии заряда.
- Решение: при первом запуске предлагается пользователю включить автозапуск и исключить приложение из оптимизации батареи. Логика определения производителя устройства реализована через device_info_plus.
- Все записи в БД имеют уникальные ключи (UNIQUE(ticker, timestamp) для свечей), что предотвращает дублирование при сбоях сети во время синхронизации.


