← Назад к вопросам

Как управлять зависимостями во 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 для тестов. Избегай конфликтов и циклических зависимостей.