Skip to content

Repository files navigation

tafka - Polymarket MVP

Flutter приложение для работы с предсказательными рынками Polymarket.

🏗️ Архитектура

Проект использует Clean Architecture с разделением на слои и Feature-First подход.

📁 Структура проекта

lib/
├── app/                    # Конфигурация приложения
│   ├── app.dart           # Главный виджет приложения
│   ├── di.dart            # Dependency Injection (Riverpod)
│   └── router.dart        # Навигация (GoRouter)
├── core/                  # Общие компоненты
│   ├── network/           # Сетевые утилиты
│   ├── storage/           # Локальное хранилище
│   └── utils/             # Утилиты
├── feature/               # Фичи приложения
│   ├── markets/           # Маркеты
│   ├── portfolio/         # Портфолио
│   └── favorites/         # Избранное
└── shared/                # Общие виджеты
    └── widgets/

🎯 Feature-First подход

Каждая фича имеет одинаковую структуру:

feature/
├── domain/                # Бизнес-логика
│   ├── models/           # Доменные модели
│   └── repo/             # Интерфейсы репозиториев
├── data/                 # Данные
│   ├── datasources/      # API клиенты
│   ├── models/           # DTO модели
│   ├── mapper/           # Мапперы DTO -> Domain
│   └── repo/             # Реализации репозиториев
└── presentation/         # UI слой
    ├── controllers/      # StateNotifier (Riverpod)
    ├── models/           # ViewState модели
    ├── mappers/          # Мапперы Domain -> ViewState
    ├── pages/            # Экраны
    └── widgets/          # UI компоненты

🔧 Технологии

  • Flutter - UI фреймворк
  • Riverpod - State Management + DI
  • GoRouter - Навигация
  • Dio - HTTP клиент
  • SharedPreferences - Локальное хранилище
  • Clean Architecture - Архитектурный паттерн

📋 Слои архитектуры

1. Domain Layer (Бизнес-логика)

  • Models - Доменные сущности (Market, Position, Tag)
  • Repositories - Интерфейсы для работы с данными
  • Не зависит от внешних слоев

2. Data Layer (Данные)

  • DataSources - API клиенты (GammaApi, ClobPricesApi)
  • DTO Models - Модели для API (MarketDto)
  • Mappers - Конвертация DTO -> Domain
  • Repository Impl - Реализация интерфейсов из Domain

3. Presentation Layer (UI)

  • Controllers - StateNotifier для управления состоянием
  • ViewState Models - Модели для UI
  • Mappers - Конвертация Domain -> ViewState
  • Pages - Экраны приложения
  • Widgets - Переиспользуемые UI компоненты

🎨 Паттерны

State Management

// StateNotifier для управления состоянием
class MarketsNotifier extends StateNotifier<MarketsState> {
  MarketsNotifier(this._repo) : super(MarketsState());

  Future<void> loadFirst() async {
    state = state.copyWith(loading: true);
    // ... бизнес-логика
  }
}

// Провайдер в DI
final marketsNotifierProvider =
StateNotifierProvider<MarketsNotifier, MarketsState>(
      (ref) => MarketsNotifier(ref.read(marketsRepoProvider)),
);

Dependency Injection

// Провайдеры в app/di.dart
final marketsRepoProvider = Provider<MarketsRepo>(
      (ref) =>
      MarketsRepoImpl(
        ref.read(gammaApiProvider),
        ref.read(clobPricesApiProvider),
      ),
);

Repository Pattern

// Интерфейс в domain
abstract class MarketsRepo {
  Future<(List<Market>, String?)> getMarketsPage

  (

  {

  ...
});
}

// Реализация в data
class MarketsRepoImpl implements MarketsRepo {
  MarketsRepoImpl(this._gamma, this._clob);

  @override
  Future<(List<Market>, String?)> getMarketsPage

  (

  {

  ...
}) async {
// ... реализация
}
}

🚀 Запуск

# Установка зависимостей
flutter pub get

# Запуск приложения
flutter run

📱 Фичи

Markets

  • Просмотр списка маркетов
  • Фильтрация по категориям (тегам)
  • Поиск маркетов
  • Детальная информация о маркете

Portfolio

  • Просмотр позиций
  • История трейдов
  • Статистика PnL

Favorites

  • Добавление/удаление из избранного
  • Просмотр избранных маркетов

🔄 Workflow

  1. Создание фичи: Создаем папку в feature/
  2. Domain: Определяем модели и интерфейсы
  3. Data: Реализуем API клиенты и репозитории
  4. Presentation: Создаем UI и контроллеры
  5. DI: Регистрируем в app/di.dart
  6. Router: Добавляем маршруты в app/router.dart

About

Polymarket flutter client

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages