Провайдер против Get_it

В поисках решений для внедрения зависимостей для Flutter я нашел две потрясающие библиотеки: provider и get_it.

Насколько я вижу, provider имеет больше шаблонов, но он очень хорошо сочетается с Flutter, позволяя Consumer перестраивать части дерева Widget после изменения введенного значения.

get_it, с другой стороны, более прямолинеен, прост в использовании и не зависит от Flutter, поэтому его можно использовать с любым кодом Dart.

Есть ли еще различия и ограничения между ними? Я знаю, что это довольно самоуверенно, но Flutter настолько нов, что было бы хорошо публично заявить о преимуществах, побочных эффектах и ​​​​подводных камнях.


person Michel Feinstein    schedule 23.07.2019    source источник


Ответы (3)


Основное различие между ними заключается в том, что provider не является строго внедрением зависимостей.

Используя виджеты, provider также может:

  • провайдеры совместимы с инструментом разработки Flutter
  • знать, когда к переменной невозможно получить доступ (с областью действия до дерева)
  • знать, когда создавать и удалять объект
  • синхронизировать модель -> модель и модель -> пользовательский интерфейс
  • переопределить некоторые значения только для определенного дерева виджетов
  • добровольно предотвратить круговую зависимость

Все это, хотя и необязательно, полезно для здоровья вашего приложения в долгосрочной перспективе.

Это гарантирует, что вы всегда будете в курсе последних событий, усложняет создание «спагетти-кода» и делает ваши различные элементы более компонуемыми.

person Rémi Rousselet    schedule 23.07.2019
comment
Интересно... Чем №1 отличается от №4? - person Michel Feinstein; 23.07.2019
comment
Предотвращение циклической зависимости может быть достигнуто без привязки модели к дереву. Например, у нас может быть совершенно новый вид дерева, сделанный только для провайдеров. Точно так же для # 1 это также включает в себя попытку получить значение внутри initState и deactivate, что может привести к ошибке в зависимости от того, что вы делаете. - person Rémi Rousselet; 23.07.2019
comment
Я имел в виду № 4, переопределить некоторые значения только для определенного дерева виджетов, но теперь я понимаю этот пример. Спасибо! - person Michel Feinstein; 23.07.2019
comment
@ Rémi-Rousselet Итак, как разработчик Provider, можете ли вы дать некоторое представление о том, когда использование Get It над провайдером было бы предпочтительнее? - person Ali80; 24.02.2020

Я объясняю только одно ограничение, которое практически обнаружил, могут быть и другие.

После поиска многих руководств и тем на Get_it о том, почему люди используют Get_it(), даже если у нас есть внедрение зависимостей в провайдере, я не смог понять разницу с точки зрения DI. Затем я застрял в Сценарии и нашел ответ на свой вопрос, каковы ограничения.

Есть ли еще различия и ограничения между ними?

Сценарий:

У меня были вложенные виджеты, у виджета A есть виджет B, а у виджета B есть виджет C, я использовал поставщика и получал доступ к значениям в каждом виджете всякий раз, когда значение менялось. Это было здорово. Затем я создал новый виджет D, который был отдельным виджетом, он не находился внутри иерархии виджетов A. Но когда я пытаюсь получить доступ к тому же значению в виджете D, оно не меняется. Потому что виджет D не находится в дереве виджета A. Теперь наступает ограничение на внедрение зависимостей провайдера.

Заключение

Вы будете использовать Get_it для доступа к значениям из виджета дерева. Но вы не можете получить доступ к обновленному значению с помощью провайдера

Обновленный ответ

В приведенном выше сценарии вам нужно обернуть приложение Provider, чтобы получить доступ ко всем зависимостям.

person M.ArslanKhan    schedule 02.09.2020
comment
Да, провайдер работает с деревом виджетов, но в большинстве случаев вы можете внедрять объекты с помощью Provider в корень вашего дерева, чтобы все ваше приложение могло считывать эти зависимости. - person Michel Feinstein; 03.09.2020

Get It — это не решение для внедрения зависимостей, а средство поиска сервисов.

Это полезно, если вы хотите быстро переключаться между двумя или более реализациями класса. Например, для макета службы и переключения между реальной службой и поддельной (для целей отладки).

Действительно, он не может извлекать/предоставлять ссылку на существующий объект (исключение составляет одноэлементный объект, но вы можете сделать то же самое самостоятельно без особых усилий) и может предоставлять только новые объекты.

person iko    schedule 21.06.2020