FutureBuilder in Flutter

Jan 21 2023
Ciao, collega appassionato di flutter! Oggi impareremo di più su come mostrare correttamente i dati asincroni da Future<T> con FutureBuilderin flutter. Sappiamo tutti che Future<T> è fantastico.

Ciao, collega appassionato di flutter!

Oggi impareremo di più su come mostrare correttamente i dati asincroni da Future<T>con FutureBuilderin flutter.

Lo sappiamo tutti, Future<T>è fantastico. Ci consente di svolgere un lavoro asincrono come il recupero dei dati dal server senza pensarci Threads e Deadlockstutto.

Future<Model> _doCalculation() async {
    // do calculation / computation asynchronously.
    ....
    return Model;
}

FutureBuilder<Model>(
        future: _doCalculationFuture,
        builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
          if (snapshot.hasData) {
            return DataWidget(snapshot.requireData);
          } else if (snapshot.hasError) {
            return ErrorWidget();
          } else {
            return CircularProgressIndicator();
          }
          return const SizedBox();
        },
      );

Dobbiamo stare attenti mentre forniamo Future<T>in FutureBuilder.Poiché FutureBuildertipicamente sarà all'interno del buildmetodo e sappiamo che buildil metodo può essere chiamato più volte, non dobbiamo creare l' Future<T>interno di esso.

Se creiamo il metodo Future<T>interno build, verrà creato di nuovo ogni volta che buildviene chiamato. Probabilmente non è quello che vuoi.

Quindi, dove crearefutures?

Il luogo ideale per creare o aggiornare un futuro sono i metodi del ciclo di vita di un widget come initState, didUpdateWidget, didChangeDependenciesecc. o qualsiasi luogo diverso dabuild.

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  late Future<Model> _doCalculationFuture;

  @override
  void initState() {
    super.initState();
    _doCalculationFuture = _doCalculation();
  }

  Future<Model> _doCalculation() async {
    return await Future<Model>.delayed(
      const Duration(seconds: 2),
      () => Model(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Model>(
      future: _doCalculationFuture,
      builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
        if (snapshot.hasData) {
          return DataWidget(snapshot.requireData);
        } else if (snapshot.hasError) {
          return ErrorWidget();
        } else {
          return CircularProgressIndicator();
        }
        return const SizedBox();
      },
    );
  }
}

Buona programmazione!!