Flutter Riverpod context.read vs Provider no método de construção

Oct 10 2020

Na documentação do Riverpod diz:

É aí que context.read(myProvider)está uma solução.

Usando-o, poderíamos refatorar nosso código anterior para:

@override 
Widget build(BuildContext context) {   
  return RaisedButton(
    onPressed: () => context.read(counterProvider).state++,
    child: Text('increment'),
  ); 
} 

Ao fazer isso, clicar em nosso botão ainda incrementa o contador. Mas não estamos mais ouvindo o provedor, o que evita reconstruções desnecessárias.

Mas então diz:

Cuidado

Evite chamar context.readdentro do buildmétodo de um widget. Se você deseja otimizar reconstruções, extraia o valor ouvido em um provedor.

Isso é um pouco confuso para mim. Primeiro a documentação dá um exemplo de uso context.readdentro do buildmétodo e depois dá um aviso para evitá-lo. Por quê?

Respostas

3 Suragch Oct 10 2020 at 16:57

O buildmétodo pode ser chamado várias vezes durante o layout. Portanto, você deve evitar qualquer trabalho extra dentro dele (como chamar um método em seu modelo).

No entanto, o onPressedretorno de chamada do RaisedButtonnão é realmente chamado quando buildé chamado. onPressedsó é chamado quando o usuário pressiona o botão. Só então a Riverpod lerá seu provedor e chamará o método no modelo. Portanto, o aviso na documentação não se aplica a essa situação.