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

Как управляешь зависимостями?

1.0 Junior🔥 191 комментариев
#Dart#Архитектура Flutter#ООП и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как управляешь зависимостями?

Управление зависимостями в Flutter — критическая часть разработки, которая влияет на размер приложения, стабильность и производительность. Существует несколько подходов и инструментов для этого.

Pub.dev — центральный репозиторий

Flutter использует pub.dev (pubspec.yaml) для управления зависимостями. Каждый пакет имеет версию, которую нужно определить в pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.0.0
  provider: ^6.0.0
  get_it: ^7.4.0
  google_fonts: ^4.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^3.0.0
  mocktail: ^1.0.0

Версионирование семантическое (SemVer)

Зависимости задаются с использованием семантического версионирования:

  • ^5.0.0 — совместимо с версией 5.x.x (не меняется major)
  • ~5.0.0 — совместимо с 5.0.x (не меняется minor)
  • 5.0.0 — точная версия
  • >=5.0.0 — версия или выше
  • >=5.0.0 <6.0.0 — диапазон версий

Основные команды

# Получить все зависимости
flutter pub get

# Обновить зависимости с учётом constraint
flutter pub upgrade

# Обновить одну зависимость
flutter pub upgrade dio

# Проверить обновления
flutter pub outdated

# Удалить зависимость
flutter pub remove dio

Локальные зависимости

Для разработки нескольких пакетов одновременно используются локальные пути:

dependencies:
  my_core:
    path: ../my_core
  
  shared_lib:
    git:
      url: https://github.com/user/shared.git
      ref: develop

Dependency Injection (DI)

Для управления зависимостями в коде используют get_it:

final getIt = GetIt.instance;

void setupServiceLocator() {
  // Синглтоны
  getIt.registerSingleton<ApiClient>(ApiClient());
  getIt.registerSingleton<DatabaseService>(DatabaseService());
  
  // Ленивые синглтоны
  getIt.registerLazySingleton<AuthRepository>(
    () => AuthRepository(apiClient: getIt<ApiClient>()),
  );
  
  // Фабрики (новый экземпляр каждый раз)
  getIt.registerFactory<LoginViewModel>(
    () => LoginViewModel(authRepository: getIt<AuthRepository>()),
  );
}

// Использование
final apiClient = getIt<ApiClient>();

Provider для управления состоянием

Provider переносит управление зависимостями и состоянием на уровень UI:

class UserRepository {
  Future<User> getUser(int id) async { ... }
}

final userRepositoryProvider = Provider((ref) => UserRepository());

final userProvider = FutureProvider<User>((ref) async {
  final repository = ref.watch(userRepositoryProvider);
  return repository.getUser(1);
});

// В виджете
Consumer(
  builder: (context, ref, child) {
    final userAsync = ref.watch(userProvider);
    return userAsync.when(
      data: (user) => Text(user.name),
      loading: () => CircularProgressIndicator(),
      error: (err, stack) => Text('Error\u0027),
    );
  },
)

GetX для DI и управления состоянием

GetX предоставляет простой и мощный способ управления зависимостями:

class AuthController extends GetxController {
  final AuthService authService = Get.put(AuthService());
  
  void login(String email, String password) {
    authService.login(email, password);
  }
}

// В виджете
Getting.put(AuthController());
final controller = Get.find<AuthController>();

Pubspec.lock для стабильности

pubspec.lock фиксирует точные версии всех зависимостей и их транзитивных зависимостей. Всегда коммитьте этот файл в git для обеспечения воспроизводимых сборок.

Лучшие практики

  1. Минимизируйте зависимости — используйте только необходимые пакеты
  2. Выбирайте популярные пакеты — они лучше поддерживаются
  3. Регулярно обновляйте — проверяйте flutter pub outdated
  4. Используйте constraint правильно — избегайте слишком широких диапазонов
  5. Документируйте причину — добавляйте комментарии о новых зависимостях
  6. Тестируйте обновления — запускайте тесты после upgrade

Правильное управление зависимостями обеспечивает стабильное, быстрое и лёгкое в поддержке приложение.