Как управляешь зависимостями?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как управляешь зависимостями?
Управление зависимостями в 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 для обеспечения воспроизводимых сборок.
Лучшие практики
- Минимизируйте зависимости — используйте только необходимые пакеты
- Выбирайте популярные пакеты — они лучше поддерживаются
- Регулярно обновляйте — проверяйте
flutter pub outdated - Используйте constraint правильно — избегайте слишком широких диапазонов
- Документируйте причину — добавляйте комментарии о новых зависимостях
- Тестируйте обновления — запускайте тесты после upgrade
Правильное управление зависимостями обеспечивает стабильное, быстрое и лёгкое в поддержке приложение.