GetIt - простой и удобный сервис-локатор

Как организовать зависимости в проекте?

Часто возникает необходимость получить доступ к классу из другого класса или виджета. Глобальные переменные и синглтоны — это не есть хорошо, на эту тему много всего написано в интернете, например: https://ru. stackoverflow. com/questions/510910/Почему-глобальные-переменные-это-зло-а-поля-класса-нет. А прокидывание ссылок в аргументы, еще и через несколько экранов, быстро превратит код в нечитаемую кашу.

На помощь приходят сервис-локаторы. Основные, используемых в коммьюнити: это get_it и provider. Provider разберем в будущих постах (пока отмечу, что он может являться полноценным стейт-менеджментом) .

Использование

Сам GetIt является синглтоном, а это значит, что доступ к нему можно получить из любого места, вот так:

GetIt.instance // Или короче: GetIt.I // Можно присвоить инстанс в глобальную переменную, и обращаться к ней: GetIt getIt = GetIt.instance;

Вначале мы регистрируем наш класс:

GetIt. I.registerSingleton(StudentsController()) ;

И затем мы можем обращаться к нему из любого места нашего приложения, вот так:

var ctrl = GetIt.I<StudentsController>()

А теперь -- основная фишка. Сервис-локатор позволяет обращаться по интерфейсу, а получать конкретную реализацию.

Например, у нас есть интерфейс (воспользуемся новыми ключевиками Dart 3.0, позволяющими создавать интерфейсные классы) :

abstract interface class IStudentsController { void study(); }

И реализация

class StudentsControllerImpl implements IStudentsController { void study() { print('Я учусь...'); } }

Регистрируем инстанс следующим образом:

GetIt.I.registerSingleton<IStudentsController>(StudentsControllerImpl());

Теперь, когда мы обращаемся к интерфейсу IStudentsController, нам будет выдаваться реализация StudentsControllerImpl.

Несмотря на словосочетание registerSingleton, которое может ввести в заблуждение, данный класс, строго говоря, синглтоном не является, поскольку можно подменить его реализацию. "Singleton" - потому что при каждом обращении к нему, будет выдаваться один и тот же инстанс (в противовес Factory, который каждый раз создает новый инстанс).

Ссылка на пакет: https://pub. dev/packages/get_it

2 комментария

Папа-программист сидит за компьютером. Рядом стоит маленький сын и жует яблоко. Вдруг он спрашивает:
— Папа, а почему, если укусить яблочко, оно потом становится коричневым?
Отец, не поворачивая головы от компьютера:
— Видишь ли, в яблоке содержится железо. После того, как плод лишается кожуры, железо окисляется под воздействием кислорода, образуется оксид железа, который имеет темную окраску.
Пауза минут на десять, после чего сын робко спрашивает:
— Пап, а с кем это ты сейчас разговаривал?