Открытие волшебства

Пакет GetIt предоставляет удобный способ доступа к службам приложений и классам управления состоянием из любой точки вашего приложения. Эта функция известна как локатор сервисов, которую часто сравнивают с внедрением зависимостей — еще одним распространенным способом разделения зависимостей в вашем приложении.

Идея внедрения зависимостей достаточно проста (просто передайте свои зависимости в качестве аргументов конструктора), но в проекте Flutter я никогда не понимал, где вообще создавать эти служебные объекты. Мне нравится GetIt, потому что им легко пользоваться. Вы определяете все свои службы в одном файле, а затем получаете их из любого места вашего приложения с помощью одной строки кода.

Я начал писать о GetIt давно. Вероятно, самой ранней статьей было Создание сервисов для выполнения работы в вашем приложении Flutter. Однако я не понимал, как GetIt работал под капотом. Это был волшебный черный ящик. Даже в Управление состоянием Flutter для минималистов, где я намеренно избегал всех сторонних пакетов управления состоянием, я все равно использовал GetIt. Однако я задавался вопросом, действительно ли мне нужен GetIt? Могу ли я сам написать код? Как это вообще работает? Я еще больше задумался об этом после того, как написал Мысли об использовании сторонних пакетов (или нет).

Затем сегодня я прочитал следующий твит в Твиттере от @dabit3. Я не очень хорошо знаком с автором, но согласен с мнением:

В этой статье я раскрою магию того, как работает GetIt. Затем вы можете выбрать для себя, хотите ли вы использовать его или написать свой собственный локатор сервисов. Если вы решите продолжать использовать GetIt (а я, вероятно, так и сделаю), по крайней мере, это больше не будет неведомой магией.

Краткий обзор

Прежде чем перейти к тому, как GetIt работает под капотом, давайте рассмотрим, как его использовать.

Предположим, у вас есть класс веб-API, к которому вы хотите получить доступ из нескольких мест в вашем приложении:

// storage_service.dart

abstract interface class StorageService {
  Future<void> saveData(String data);
}

class WebApi implements StorageService {
  @override
  Future<void>…