Flutter Riverpod context.read vs Provider в методе сборки

Oct 10 2020

В документации 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метода, а затем дается предупреждение, чтобы этого избежать. Почему?

Ответы

3 Suragch Oct 10 2020 at 16:57

Во buildвремя макета метод можно вызывать несколько раз. Таким образом, вам следует избегать какой-либо дополнительной работы внутри него (например, вызова метода в вашей модели).

Однако onPressedобратный вызов RaisedButtonне вызывается при buildвызове. onPressedвызывается только тогда, когда пользователь нажимает кнопку. Только тогда Riverpod прочитает вашего провайдера и вызовет метод модели. Таким образом, предупреждение в документации к этой ситуации неприменимо.