Flutter Riverpod context.read vs Provider nel metodo build
Nella documentazione Riverpod dice:
Ecco dov'è
context.read(myProvider)una soluzione.Usandolo, potremmo effettuare il refactoring del nostro codice precedente per:
@override Widget build(BuildContext context) { return RaisedButton( onPressed: () => context.read(counterProvider).state++, child: Text('increment'), ); }In questo modo, facendo clic sul nostro pulsante si incrementa ancora il contatore. Ma non stiamo più ascoltando il provider, il che evita ricostruzioni non necessarie.
Ma poi dice:
attenzione
Evita di chiamare
context.readall'interno delbuildmetodo di un widget. Se vuoi ottimizzare le ricostruzioni, estrai invece il valore ascoltato in un Provider.
Questo è un po 'di confusione per me. Prima la documentazione fornisce un esempio di utilizzo context.readall'interno del buildmetodo e poi dà un avvertimento per evitarlo. Perché?
Risposte
Il buildmetodo può essere chiamato più volte durante il layout. Quindi dovresti evitare di fare qualsiasi lavoro extra al suo interno (come chiamare un metodo sul tuo modello).
Tuttavia, il onPressedcallback di RaisedButtonnon viene effettivamente chiamato quando buildviene chiamato. onPressedviene chiamato solo quando l'utente preme il pulsante. Solo allora Riverpod leggerà il tuo provider e chiamerà il metodo sul modello. Quindi l'avvertimento nella documentazione non si applica in quella situazione.