Flutter Riverpod context.read vs Provider nel metodo build

Oct 10 2020

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 del buildmetodo 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

3 Suragch Oct 10 2020 at 16:57

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.