Во Flutter я чувствую себя немного потерянным из-за того, как я создаю свои параметры для классов, и знаю, как лучше всего создавать эти параметры. Обычно параметры — это просто классы для внедрения в другой класс для выполнения задач. Кажется, что на самом деле не имеет значения, как эти параметры создаются с точки зрения функциональности, поскольку код работает со всеми методами создания. Я вижу онлайн-людей, говорящих о локаторах сервисов, синглтонах, внедрении зависимостей. Заявления Riverpod на веб-сайте Поставщики — это полная замена таких шаблонов, как синглтоны, локаторы сервисов, внедрение зависимостей или наследуемые виджеты. Так что я думаю, что мне не нужен сервисный локатор, так как я использую Riverpod. Однако я не могу найти в Интернете ничего о том, как я могу внедрить услугу у провайдеров Riverpod. Я вижу, что вы можете прочитать поставщика без контекста с помощью ProviderContainer().read
, но это для использования в качестве внедрения службы? Является ли это синглтоном, так что в значительной степени он является сервисным локатором? В примере с Riverpod говорится, что вам не нужен ProviderContainer().read
для Flutter, что звучит так, как будто это не замена чему-либо вроде локатора сервисов:
// Where the state of our providers will be stored.
// Avoid making this a global variable, for testability purposes.
// If you are using Flutter, you do not need this.
final container = ProviderContainer();
Вот пример кода, поле в классе, которое является ViewModel, которое принимает некоторые варианты использования в качестве параметров. Примерами использования здесь являются классы действий уровня домена, которые вызывают репозитории для выполнения внешних действий, таких как запросы API или манипуляции с локальным хранилищем.
final CreateUserViewModel createUserViewModel =
CreateUserViewModel(SavePasswordLocallyUseCase(), CreateUserUseCase());
...
Так что я буквально создал их в строке, как SavePasswordLocallyUseCase()
, чтобы вводить их. Это определенно самый простой подход с наименьшим количеством кода. Я предполагаю, что это может быть менее эффективно, поскольку каждый раз создается новый, хотя я не вижу, чтобы это обычно имело видимую разницу. Будут ли эти параметры, созданные таким образом, очищаться сборщиком мусора? Каковы последствия этого?
Если бы мне пришлось внедрить тип AuthenticationService
, должен ли я использовать локатор сервисов или создавать их встроенными, как AuthenticationService()
, или использовать ProviderContainer.read()
от Riverpod?