GetIt - простой и удобный сервис-локатор
Как организовать зависимости в проекте?
Часто возникает необходимость получить доступ к классу из другого класса или виджета. Глобальные переменные и синглтоны — это не есть хорошо, на эту тему много всего написано в интернете, например: https://ru. stackoverflow. com/questions/510910/Почему-глобальные-переменные-это-зло-а-поля-класса-нет. А прокидывание ссылок в аргументы, еще и через несколько экранов, быстро превратит код в нечитаемую кашу.
На помощь приходят сервис-локаторы. Основные, используемых в коммьюнити: это get_it и provider. Provider разберем в будущих постах (пока отмечу, что он может являться полноценным стейт-менеджментом) .
Использование
Сам GetIt является синглтоном, а это значит, что доступ к нему можно получить из любого места, вот так:
Вначале мы регистрируем наш класс:
И затем мы можем обращаться к нему из любого места нашего приложения, вот так:
А теперь -- основная фишка. Сервис-локатор позволяет обращаться по интерфейсу, а получать конкретную реализацию.
Например, у нас есть интерфейс (воспользуемся новыми ключевиками Dart 3.0, позволяющими создавать интерфейсные классы) :
И реализация
Регистрируем инстанс следующим образом:
Теперь, когда мы обращаемся к интерфейсу IStudentsController, нам будет выдаваться реализация StudentsControllerImpl.
Несмотря на словосочетание registerSingleton, которое может ввести в заблуждение, данный класс, строго говоря, синглтоном не является, поскольку можно подменить его реализацию. "Singleton" - потому что при каждом обращении к нему, будет выдаваться один и тот же инстанс (в противовес Factory, который каждый раз создает новый инстанс).
Ссылка на пакет: https://pub. dev/packages/get_it