Flutter Riverpod context.read vs Provider в методе сборки
В документации Riverpod сказано:
Вот где
context.read(myProvider)есть решение.Используя его, мы могли бы реорганизовать наш предыдущий код, чтобы:
@override Widget build(BuildContext context) { return RaisedButton( onPressed: () => context.read(counterProvider).state++, child: Text('increment'), ); }Таким образом, нажатие на нашу кнопку по-прежнему увеличивает счетчик. Но мы больше не слушаем провайдера, что позволяет избежать ненужных перестроек.
Но тут говорится:
осторожность
Избегайте вызова
context.readвнутриbuildметода виджета. Если вы хотите оптимизировать перестроения, извлеките вместо этого значение, прослушиваемое в Provider.
Меня это немного сбивает с толку. Сначала в документации дается пример использования context.readвнутри buildметода, а затем дается предупреждение, чтобы этого избежать. Почему?
Ответы
Во buildвремя макета метод можно вызывать несколько раз. Таким образом, вам следует избегать какой-либо дополнительной работы внутри него (например, вызова метода в вашей модели).
Однако onPressedобратный вызов RaisedButtonне вызывается при buildвызове. onPressedвызывается только тогда, когда пользователь нажимает кнопку. Только тогда Riverpod прочитает вашего провайдера и вызовет метод модели. Таким образом, предупреждение в документации к этой ситуации неприменимо.