← Назад к вопросам
Как управлять зависимостями во Flutter проекте?
1.2 Junior🔥 72 комментариев
#Git и CI/CD
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Управление зависимостями во Flutter проекте
Зависимости во Flutter управляются через pubspec.yaml файл и инструмент pub (или flutter pub). Правильное управление версиями критично для стабильности проекта.
Структура pubspec.yaml
name: my_flutter_app
description: My awesome Flutter app.
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: '>=3.0.0 <4.0.0'
flutter: '>=3.10.0'
dependencies:
flutter:
sdk: flutter
# Прямые зависимости
http: ^1.1.0
provider: ^6.0.0
get_it: ^7.5.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
mockito: ^5.4.0
integration_test:
sdk: flutter
flutter:
uses-material-design: true
Версионирование и constraints
Semantic Versioning (SemVer)
Все пакеты используют major.minor.patch:
1.2.3
^ ^ ^
| | └─ patch (исправления багов, совместима)
| └─── minor (новые функции, совместима)
└───── major (breaking changes, может быть несовместима)
Версионные constraint-ы
dependencies:
# Exact version
http: 1.1.0
# Caret (^) — совместимо с minor версиями
# ^ допускает обновления до следующей major версии
provider: ^6.0.0 # >=6.0.0 <7.0.0
# Tilde (~) — совместимо только с patch версиями
# ~ ограничивает обновления до следующей minor версии
get_it: ~7.5.0 # >=7.5.0 <7.6.0
# Range
intl: '>=0.17.0 <1.0.0'
# Any version (опасно!)
some_package: any
# >= и <=
legacy_package: '>=2.0.0'
Добавление зависимостей
Через командную строку
# Добавить последнюю версию
flutter pub add http
# Добавить конкретную версию
flutter pub add http:1.1.0
# Добавить dev зависимость
flutter pub add --dev mockito
Вручную в pubspec.yaml
dependencies:
http: ^1.1.0
dev_dependencies:
mockito: ^5.4.0
Затем:
flutter pub get
Основные зависимости (Best Practices)
Сетевые запросы
dependencies:
# HTTP клиент (встроенный)
http: ^1.1.0
# Или Dio (более мощный)
dio: ^5.3.0
// http
import 'package:http/http.dart' as http;
final response = await http.get(Uri.parse('https://api.example.com/data'));
// Dio
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.get('https://api.example.com/data');
State Management
dependencies:
# Provider (рекомендуется)
provider: ^6.0.0
# Или Riverpod (более новый)
# riverpod: ^2.4.0
# Или GetX
# get: ^4.6.0
JSON сериализация
dependencies:
# Встроенный dart:convert (простой)
# Или Freezed (код генерируется)
freezed_annotation: ^2.4.0
json_serializable: ^6.7.0
dev_dependencies:
freezed: ^2.4.0
build_runner: ^2.4.0
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart'; // Генерируемый код
@JsonSerializable()
class User {
final String id;
final String name;
User({required this.id, required this.name});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
// Генерировать код
// flutter pub run build_runner build
Dependency Injection
dependencies:
# GetIt (самый популярный)
get_it: ^7.5.0
# Или Riverpod
# riverpod: ^2.4.0
import 'package:get_it/get_it.dart';
final getIt = GetIt.instance;
// Регистрация
void setupServiceLocator() {
getIt.registerSingleton<UserRepository>(UserRepositoryImpl());
getIt.registerLazySingleton<UserUseCase>(() => UserUseCase(getIt()));
}
// Использование
final userRepository = getIt<UserRepository>();
Логирование
dev_dependencies:
# Logger
logger: ^2.0.0
import 'package:logger/logger.dart';
final logger = Logger();
logger.i('Info message');
logger.w('Warning');
logger.e('Error', error: e, stackTrace: st);
Управление версиями
pubspec.lock — блокировка версий
# pubspec.lock хранит ТОЧНЫЕ версии (автогенерируется)
packages:
http:
dependency: direct main
description:
name: http
sha256: '...'
url: "https://pub.dev"
source: hosted
version: "1.1.0"
Правило: Коммитить pubspec.lock в git для стабильности!
git add pubspec.lock
git commit -m 'Lock dependencies'
Обновление зависимостей
# Получить новые версии (respect constraints)
flutter pub get
# Обновить до последних версий
flutter pub upgrade
# Обновить конкретную зависимость
flutter pub upgrade http
# Проверить устаревшие пакеты
flutter pub outdated
Проверка версий и совместимости
# Проверить, какие версии подходят
flutter pub add http --dry-run
# Показать graph зависимостей
flutter pub deps
# Проверить есть ли issues с зависимостями
flutter pub list
Конфликты зависимостей
Проблема: разные версии одной зависимости
ERROR: The current Dart SDK version is 3.1.0.
Because http >=1.2.0 requires sdk >=3.2.0, version 1.2.0 of http is forbidden.
Решение 1: Обновить constraint
dependencies:
# Было
http: ^1.1.0
# Стало — ограничить версию
http: ^1.1.0 # Остаться на совместимой версии
Решение 2: Использовать dependency_overrides
dependency_overrides:
# Принудительно использовать эту версию
http: 1.1.0
Решение 3: Обновить SDK
flutter upgrade
Локальные пакеты
Работа с локальным пакетом
dependencies:
# Локальный путь
my_local_package:
path: ../my_local_package
Создание собственного пакета
flutter create --template=package my_package
Экспортирование пакета
# Опубликовать на pub.dev
flutter pub publish
# Сначала проверить
flutter pub publish --dry-run
Лучшие практики
1. Фиксируй версии production зависимостей
dependencies:
http: ^1.1.0 # Разумное ограничение
# Не используй any!
2. Используй dev_dependencies для тестирования
dev_dependencies:
flutter_test:
sdk: flutter
mockito: ^5.4.0 # Только для тестов
integration_test:
sdk: flutter
3. Регулярно обновляй зависимости
# Раз в неделю проверяй обновления
flutter pub outdated
# Безопасно обновляй patch версии
flutter pub upgrade
4. Проверяй лицензии пакетов
flutter pub deps --no-dev | grep LICENSE
5. Избегай циклических зависимостей
❌ package A зависит от B
package B зависит от A
✅ package A зависит от B
package B не зависит от A
Пример современного проекта
name: modern_app
environment:
sdk: '>=3.1.0 <4.0.0'
flutter: '>=3.13.0'
dependencies:
flutter:
sdk: flutter
# API
http: ^1.1.0
dio: ^5.3.0
# State management
provider: ^6.0.0
# DI
get_it: ^7.5.0
# JSON
json_serializable: ^6.7.0
# UI
flutter_lints: ^2.0.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.0
freezed: ^2.4.0
mockito: ^5.4.0
flutter:
uses-material-design: true
Вывод: Управляй зависимостями через pubspec.yaml с разумными версионными constraint-ами. Коммитой pubspec.lock, регулярно проверяй обновления, используй dev_dependencies для тестов. Избегай конфликтов и циклических зависимостей.