Трепетание провайдера против ValueNotifier

#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 . Вы можете прочитать больше об этом, отсюда и первая часть.