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


person Suragch    schedule 10.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? Flutter Riverpod - использование метода сборки read () внутри   -  person Alex Hartford    schedule 12.10.2020


Ответы (1)


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

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

person Suragch    schedule 10.10.2020
comment
Вы знаете, как будет выглядеть пример extract the value listened in a Provider instead? Как мне кажется, в документах они всегда читают провайдеров внутри метода сборки, если читают из виджета. Я не понимаю, почему использование watch внутри метода сборки является лучшим решением. Может ли это означать использование ProviderContainer (). Read () из виджета, но вне метода сборки? - person BeniaminoBaggins; 17.07.2021
comment
@BeniaminoBaggins, это хороший вопрос. Я и сам немного не понимаю. - person Suragch; 17.07.2021