Flutter Riverpod context.read vs Provider no método de construção
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 dobuildmé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
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.