#flutter #provider
#флаттер #провайдер
Вопрос:
Может кто-нибудь объяснить разницу между использованием пакета Provider и использованием ValueNofifier?
Прямо сейчас я использую ValueNotifier и ValueListenableBuilder в своем приложении, и я вижу так много сходства между этим и использованием поставщиков и потребителей. У обоих есть прослушиватели, которые перестраивают виджеты с учетом последних предоставленных данных, и оба используют ChangeNotifier и notifyListeners.
Итак, в чем разница и когда мы должны выбрать один из них вместо другого?
Спасибо
Ответ №1:
Что касается моего опыта использования обеих вещей в приложении, то основное отличие заключается в том, что
Provider
может вносить изменения в любую часть приложения, например, в любом месте с использованиемnotifyListener()
, и к нему можно получить доступ из любого места приложения. Однако существует вероятность ошибки при использовании глобальногоValueNotifier
, что не рекомендуется. Технически, это не дает вам большого контроля над отслеживанием ошибок, когда код становится большим.
Provider(
create: (_) => MyModel(),
child: ...
)
Другое существенное отличие:
Provider
дает вам возможность использовать несколько поставщиков и может храниться только в одном массиве поставщиков, однако вValueNotifier
вы очень ограничены в использовании одного значения за раз. Для использования нескольких ValueNotifiers вам необходимо создать несколько ValueNotifiers, а затем каждый раз удалять все это.
MultiProvider(
providers: [
Provider<Something>(create: (_) => Something()),
Provider<SomethingElse>(create: (_) => SomethingElse()),
Provider<AnotherThing>(create: (_) => AnotherThing()),
],
child: someWidget,
)
По сути, это аккуратный способ отделить вашу бизнес-логику от обычной логики приложения.
Комментарии:
1. Я согласен со второй частью ответа, но для первой части вы можете использовать глобальный ValueNotfier и использовать его в любом месте приложения. Почему это не рекомендуется и почему provider предоставляет вам лучший способ сделать то же самое?
2. Это дает вам больше контроля над изменением @Morez. Например, если вы создаете глобальное значение и хотите изменить любое место, возможно, вы не знаете, где вы внесли изменения в значение, когда код становится большим, но когда у вас есть поставщики, вы действительно знаете, поскольку у вас есть набор методов класса, которые обрабатывают изменения, которые вы используете
notifyListeners()
. Вид ошибки отслеживания более эффективен. Как правило, использование flutter не является хорошей практикойglobals
. Вы можете прочитать больше об этом, отсюда и первая часть.