La programació asíncrona és una tècnica que permet executar operacions de manera no bloquejant, és a dir, permet que el programa continuï executant altres tasques mentre espera que una operació asíncrona es completi. En Dart, la programació asíncrona és essencial per a la construcció d'aplicacions reactives i eficients, especialment quan es treballa amb operacions d'entrada/sortida (I/O) com ara la lectura de fitxers, la comunicació de xarxa o les consultes a bases de dades.
Conceptes Clau
Futures
Un Future
representa una operació que es completarà en algun moment en el futur. Pot tenir tres estats:
- Pendiente: La operació encara no s'ha completat.
- Completat amb èxit: La operació s'ha completat amb èxit i ha retornat un valor.
- Completat amb error: La operació s'ha completat amb un error.
Async i Await
Les paraules clau async
i await
s'utilitzen per treballar amb operacions asíncrones de manera més senzilla i llegible.
async
: S'utilitza per marcar una funció com a asíncrona.await
: S'utilitza dins d'una funcióasync
per esperar que unFuture
es completi.
Exemples Pràctics
Exemple 1: Utilitzant Futures
Future<String> fetchUserOrder() { // Simula una operació de xarxa amb un retard de 2 segons return Future.delayed(Duration(seconds: 2), () => 'Cafè amb llet'); } void main() { print('Inici de la comanda'); fetchUserOrder().then((order) { print('La teva comanda és: $order'); }); print('Fi de la comanda'); }
Explicació:
fetchUserOrder
retorna unFuture
que es completa després de 2 segons amb el valor 'Cafè amb llet'.main
imprimeix 'Inici de la comanda', cridafetchUserOrder
i després imprimeix 'Fi de la comanda'.- Quan el
Future
es completa, el callback passat athen
s'executa i imprimeix 'La teva comanda és: Cafè amb llet'.
Exemple 2: Utilitzant Async i Await
Future<String> fetchUserOrder() async { // Simula una operació de xarxa amb un retard de 2 segons return await Future.delayed(Duration(seconds: 2), () => 'Cafè amb llet'); } void main() async { print('Inici de la comanda'); var order = await fetchUserOrder(); print('La teva comanda és: $order'); print('Fi de la comanda'); }
Explicació:
fetchUserOrder
és una funcióasync
que espera 2 segons abans de retornar 'Cafè amb llet'.main
és també una funcióasync
que espera el resultat defetchUserOrder
abans de continuar.
Exercicis Pràctics
Exercici 1: Simulació d'una Operació de Xarxa
Escriu una funció fetchData
que simuli una operació de xarxa que triga 3 segons a completar-se i retorna la cadena 'Dades rebudes'. Utilitza async
i await
per esperar el resultat i imprimeix-lo a la consola.
Future<String> fetchData() async { // Escriu el teu codi aquí } void main() async { // Escriu el teu codi aquí }
Solució:
Future<String> fetchData() async { return await Future.delayed(Duration(seconds: 3), () => 'Dades rebudes'); } void main() async { print('Inici de la recuperació de dades'); var data = await fetchData(); print('Resultat: $data'); print('Fi de la recuperació de dades'); }
Exercici 2: Gestió d'Errors
Modifica la funció fetchData
per simular un error en la recuperació de dades. Utilitza try-catch
per gestionar l'error i imprimeix un missatge d'error a la consola.
Future<String> fetchData() async { // Escriu el teu codi aquí } void main() async { // Escriu el teu codi aquí }
Solució:
Future<String> fetchData() async { return await Future.delayed(Duration(seconds: 3), () => throw 'Error en la recuperació de dades'); } void main() async { print('Inici de la recuperació de dades'); try { var data = await fetchData(); print('Resultat: $data'); } catch (e) { print('S\'ha produït un error: $e'); } print('Fi de la recuperació de dades'); }
Resum
En aquesta secció, hem après els conceptes bàsics de la programació asíncrona en Dart, incloent l'ús de Future
, async
i await
. Hem vist com aquestes eines ens permeten escriure codi no bloquejant de manera més llegible i hem practicat amb exemples i exercicis pràctics. La programació asíncrona és una habilitat essencial per a qualsevol desenvolupador de Dart, especialment quan es treballa amb operacions d'entrada/sortida.
Curs de Programació en Dart
Mòdul 1: Introducció a Dart
- Introducció a Dart
- Configuració de l'Entorn de Desenvolupament
- El Teu Primer Programa en Dart
- Sintaxi i Estructura Bàsica
Mòdul 2: Conceptes Bàsics de Dart
Mòdul 3: Col·leccions
Mòdul 4: Programació Orientada a Objectes en Dart
Mòdul 5: Funcionalitats Avançades de Dart
Mòdul 6: Gestió d'Errors i Depuració
Mòdul 7: Paquets i Biblioteques de Dart
Mòdul 8: Dart per a Web i Mòbil
- Introducció a Flutter
- Construcció d'una Aplicació Simple amb Flutter
- Dart per al Desenvolupament Web