Библиотека для взаимодействия с API сервера мобильного приложения Matule 2026, разрабатываемого в рамках чемпионата «Профессионалы». Предоставляет готовые сервисы и модели данных для работы с бэкендом на базе PocketBase.
- ⚡️ Основана на мощном HTTP-клиенте
dio. - 🧩 Модели данных генерируются с помощью
freezed– иммутабельность и удобная сериализация JSON. - 🔐 Автоматическое добавление JWT-токена в заголовки после аутентификации.
- 🖼️ Загрузка файлов через
multipart/form-data(например, изображения для проектов). - ✅ Интеграционные тесты, проверяющие работу с реальным сервером.
- 🧱 Чёткое разделение на сервисы по функциональным модулям.
- Dart SDK
>=3.0.0 - Flutter (только для запуска тестов)
- Развёрнутый сервер PocketBase (см. раздел Связанные проекты)
Добавьте зависимость в pubspec.yaml вашего проекта:
dependencies:
network:
git:
url: https://github.com/DenUP/network.git
ref: main
dio: ^5.4.0
freezed_annotation: ^2.4.1
json_annotation: ^4.8.1
dev_dependencies:
build_runner: ^2.4.6
freezed: ^2.4.5
json_serializable: ^6.7.1
flutter_test:
sdk: flutterЗатем выполните:
flutter pub getЕсли вы вносили изменения в freezed-классы, сгенерируйте код:
flutter pub run build_runner build --delete-conflicting-outputsПеред использованием создайте экземпляр Dio с базовым URL вашего сервера и при необходимости добавьте токен авторизации.
import 'package:dio/dio.dart';
import 'package:network/user_service.dart';
import 'package:network/shop_service.dart';
import 'package:network/project_service.dart';
import 'package:network/basket_service.dart';
final dio = Dio(BaseOptions(baseUrl: 'http://localhost:8090/api'));
// После успешного входа токен можно установить так:
dio.options.headers['Authorization'] = 'Bearer $token';
// Создание сервисов
final userService = UserService(dio: dio);
final shopService = ShopService(dio: dio);
final projectService = ProjectService(dio: dio);
final basketService = BasketService(dio: dio);lib/
├── entity/ # Модели данных
│ ├── user/ # Пользователи (User, ResponseAuth, UserAuthList)
│ ├── shop/ # Товары и новости (Product, ResponseProducts, ResponsesNews)
│ ├── project/ # Проекты (Project, ResponsesProject)
│ └── basket/ # Корзина (ResponseCart)
├── user_service.dart # Сервис пользователей
├── shop_service.dart # Сервис магазина (товары, новости)
├── project_service.dart # Сервис проектов
├── basket_service.dart # Сервис корзины
└── network.dart # (Опционально) обёртка для инициализации
// Вход
final auth = await userService.userLogIn(
email: 'user@example.com',
password: '12345678',
);
// Устанавливаем токен для всех последующих запросов
dio.options.headers['Authorization'] = 'Bearer ${auth.token}';
// Получаем данные пользователя по ID
final user = await userService.userRecordsIdUser(idUser: auth.record.id);
print('Привет, ${user.email}!');import 'dart:io';
import 'package:dio/dio.dart';
// Подготовка файла
final imageFile = File('path/to/project.jpg');
final multipartFile = await MultipartFile.fromFile(
imageFile.path,
filename: 'project.jpg',
contentType: DioMediaType('image', 'jpeg'),
);
// Создание проекта
final newProject = await projectService.addProject(
title: 'Мой проект',
typeProject: 'Разработка',
user_id: userId,
dateStart: '2025-10-05',
dateEnd: '2025-10-06',
gender: 'Male',
description_source: 'Описание проекта',
category: 'IT',
image: multipartFile,
);
print('Проект создан, ID: ${newProject.id}');final products = await shopService.searchProduct('футболка');
for (var item in products.items) {
print('${item.title} – ${item.price} руб.');
}// Создание записи в корзине
final cartItem = await basketService.addBasket(
user_id: userId,
product_id: productId,
count: 2,
);
// Изменение количества
final updated = await basketService.editBasket(
id_bucket: cartItem.id,
user_id: userId,
product_id: productId,
count: 3,
);В библиотеке реализованы интеграционные тесты, которые обращаются к реальному серверу PocketBase.
- Убедитесь, что сервер доступен по адресу
http://192.168.1.146:8090(при необходимости изменитеbaseUrlв тестах). - В базе должен существовать пользователь
test21@test.ruс паролем12345678.
Если его нет – создайте вручную или раскомментируйте тест регистрации.
flutter test test/Тесты используют общий экземпляр Dio, авторизация выполняется один раз в setUpAll. В консоль выводятся токены и идентификаторы для отладки.
| Проект | Описание | Ссылка |
|---|---|---|
| Сервер (PocketBase + Docker) | Готовое окружение для локального развёртывания бэкенда | GitHub |
| UI-kit | Дизайн-система приложения (виджеты, цвета, типографика) | GitHub |
| Макет в Figma | Дизайн мобильного приложения Matule 2026 | Figma |
| Основное приложение | Репозиторий самого приложения (в разработке) | – |
Проект распространяется под лицензией MIT. Это означает, что вы можете свободно использовать, копировать, изменять, объединять, публиковать, распространять, сублицензировать и/или продавать копии данного программного обеспечения при соблюдении следующих условий:
- Уведомление об авторских правах и сам текст лицензии должны быть включены во все копии или значимые части программного обеспечения.
Отказ от ответственности: ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ ЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С НИМ.
Полный текст лицензии доступен в файле LICENSE в корне репозитория.