Настройка Dependency Injection (GetIt) во Flutter-приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Настройка Dependency Injection (GetIt) во Flutter-приложении
Простая
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Настройка Dependency Injection (GetIt) во Flutter-приложении

GetIt — service locator для Dart/Flutter, де-факто стандарт для DI в проектах, где не нужна кодогенерация. Принцип простой: регистрируешь зависимости один раз при старте приложения, запрашиваешь в любом месте через GetIt.instance<T>() или сокращение sl<T>().

Почему именно GetIt, а не что-то другое

provider и Riverpod — это State Management с DI как побочным эффектом. GetIt — чистый service locator без Flutter-зависимостей: его можно использовать в domain-слое без BuildContext. Для Clean Architecture, где domain-слой ничего не знает о Flutter, это принципиально.

Конструктор GetIt поддерживает три режима регистрации:

  • registerSingleton<T> — создаёт сразу при регистрации, живёт всё время работы приложения
  • registerLazySingleton<T> — создаёт при первом обращении, потом возвращает тот же инстанс
  • registerFactory<T> — создаёт новый инстанс при каждом обращении

На практике: ApiService, DatabaseHelper, SharedPreferences-обёртка — registerLazySingleton. ViewModel или BLoC, если их создаёт GetIt (редко) — registerFactory. Чаще BLoC создаётся через BlocProvider, а GetIt держит только инфраструктурный слой.

Типичная ошибка при инициализации

// Неправильно — синхронная регистрация асинхронной зависимости
sl.registerLazySingleton<DatabaseHelper>(() => DatabaseHelper()..init());

// Правильно — async init через registerSingletonAsync
sl.registerSingletonAsync<DatabaseHelper>(() async {
  final db = DatabaseHelper();
  await db.init();
  return db;
});
// И дождаться готовности перед runApp:
await sl.allReady();

Если не использовать registerSingletonAsync + allReady(), DatabaseHelper может быть запрошен до завершения асинхронной инициализации — крэш на старте с StateError: Singleton is not ready yet.

Организация injection_container.dart

Стандартная практика — один файл injection_container.dart (или di/) с функцией initDependencies():

Future<void> initDependencies() async {
  // External
  final sharedPrefs = await SharedPreferences.getInstance();
  sl.registerLazySingleton(() => sharedPrefs);
  sl.registerLazySingleton(() => http.Client());

  // Data sources
  sl.registerLazySingleton<AuthRemoteDataSource>(
    () => AuthRemoteDataSourceImpl(sl()),
  );

  // Repositories
  sl.registerLazySingleton<AuthRepository>(
    () => AuthRepositoryImpl(sl()),
  );

  // Use cases
  sl.registerLazySingleton(() => LoginUseCase(sl()));

  // BLoCs — если создаются через GetIt
  sl.registerFactory(() => AuthBloc(loginUseCase: sl()));
}

Регистрируем в порядке зависимостей снизу вверх: сначала внешние зависимости, потом data sources, репозитории, use cases, наконец — presentation слой.

GetIt + flutter_modular или feature-based DI

На крупных проектах один injection_container.dart превращается в 500 строк. Решение: разбить по фичам. Каждый feature-модуль регистрирует свои зависимости через отдельную функцию initAuthDependencies(), initProfileDependencies() — вызываются из главного initDependencies().

Что делаем в рамках настройки

Анализируем текущую архитектуру проекта → определяем слои и зависимости → настраиваем injection_container с корректными временами жизни → прописываем async-инициализацию для БД и Storage → покрываем регистрацию unit-тестами через mock-подмену в тестовом setUp.

Работа занимает 1–2 дня в зависимости от размера проекта и количества существующих зависимостей.