En Flutter, el widget FutureBuilder se usa para crear widgets según sea necesario. FutureBuilder es un widget que lo ayudará a ejecutar alguna función asincrónica y, según el resultado de esa función, su interfaz de usuario se actualizará.
FutureBuilder es Stateful por naturaleza, es decir, mantiene su propio estado como lo hacemos nosotros en StatefulWidgets .
Sintaxis :
FutureBuilder( Key key, this.future, this.initialData, @required this.builder, ) And, builder should not be null.
Cuando usamos el widget FutureBuilder , debemos verificar el estado futuro, es decir, el futuro está resuelto o no, y así sucesivamente. Hay varios estados de la siguiente manera:
- ConnectionState.none : significa que el futuro es nulo y initialData se usa como valor predeterminado .
- ConnectionState.active : Significa que el futuro no es nulo pero aún no está resuelto.
- ConnectionState.waiting : significa que el futuro se está resolviendo y obtendremos el resultado lo suficientemente pronto.
- ConnectionState.done : Significa que el futuro se ha resuelto.
Crearemos el widget FutureBuilder paso a paso.
Paso 1 : Crea un futuro que necesita ser resuelto.
Dart
/// Function that will return a /// "string" after some time /// To demonstrate network call /// delay of [2 seconds] is used /// /// This function will behave as an /// asynchronous function Future<String> getData() { return Future.delayed(Duration(seconds: 2), () { return "I am data"; // throw Exception("Custom Error"); }); }
El fragmento anterior es para demostrar una llamada de red real. Hemos utilizado un retraso de 2 segundos.
Paso 2 : Cree un widget de FutureBuilder y administre el estado de espera.
Dart
FutureBuilder( builder: (ctx, snapshot) { ... some code here // Displaying LoadingSpinner to indicate waiting state return Center( child: CircularProgressIndicator(), ); }, // Future that needs to be resolved // inorder to display something on the Canvas future: getData(), ),
En este fragmento, podemos ver que estamos devolviendo un LoadingSpinner. Solo se mostrará cuando el futuro esté en estado de espera .
Paso 3 : Administrar el estado Finalizado futuro , es decir, cuando se resuelva el futuro. Este paso también requiere verificar cualquier error que pueda ocurrir durante una llamada de red.
Dart
FutureBuilder( builder: (ctx, snapshot) { // Checking if future is resolved if (snapshot.connectionState == ConnectionState.done) { // If we got an error if (snapshot.hasError) { return Center( child: Text( '${snapshot.error} occurred', style: TextStyle(fontSize: 18), ), ); // if we got our data } else if (snapshot.hasData) { // Extracting data from snapshot object final data = snapshot.data as String; return Center( child: Text( '$data', style: TextStyle(fontSize: 18), ), ); } } ... some code here ),
En el fragmento anterior, puede ver que estamos comprobando
snapshot.hasError This step is require because it could be possible that future is resolved but an error has occurred.
también estamos revisando
snapshot.hasData This step is required because it may be possible that future is resolved but nothing is returned due to some reasons, so always perform these checks otherwise you may get unexpected behaviour.
Código fuente completo:
Dart
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'GeeksforGeeks', // to hide debug banner debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.green, ), home: HomePage(), ); } } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( appBar: AppBar( title: Text('GeeksforGeeks'), ), body: Center( child: ElevatedButton( onPressed: () => Navigator.push( context, MaterialPageRoute( builder: (ctx) => FutureDemoPage(), ), ), child: Text('Demonstrate FutureBuilder'), ), ), ), ); } } class FutureDemoPage extends StatelessWidget { /// Function that will return a /// "string" after some time /// To demonstrate network call /// delay of [2 seconds] is used /// /// This function will behave as an /// asynchronous function Future<String> getData() { return Future.delayed(Duration(seconds: 2), () { return "I am data"; // throw Exception("Custom Error"); }); } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( appBar: AppBar( title: Text('Future Demo Page'), ), body: FutureBuilder( builder: (ctx, snapshot) { // Checking if future is resolved or not if (snapshot.connectionState == ConnectionState.done) { // If we got an error if (snapshot.hasError) { return Center( child: Text( '${snapshot.error} occurred', style: TextStyle(fontSize: 18), ), ); // if we got our data } else if (snapshot.hasData) { // Extracting data from snapshot object final data = snapshot.data as String; return Center( child: Text( '$data', style: TextStyle(fontSize: 18), ), ); } } // Displaying LoadingSpinner to indicate waiting state return Center( child: CircularProgressIndicator(), ); }, // Future that needs to be resolved // inorder to display something on the Canvas future: getData(), ), ), ); } }
Salida :
Publicación traducida automáticamente
Artículo escrito por sanjeev2552 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA