Funzioni Asincrone in Dart e Flutter: Guida con esempi ed esercizi

2
minuti
25/3/25

Quando si sviluppano applicazioni moderne, soprattutto con Flutter, è fondamentale comprendere e padroneggiare la gestione delle operazioni asincrone.

Dart, il linguaggio di programmazione utilizzato per Flutter, offre un supporto nativo per l'asincronismo attraverso parole chiave come async, await, e oggetti come Future e Stream.

In questo articolo ti spiegherò tutto ciò che devi sapere, mostrandoti esempi pratici e proponendoti esercizi per mettere alla prova le tue competenze.

Cosa sono le funzioni asincrone

Le funzioni asincrone sono funzioni che consentono di eseguire operazioni che richiedono tempo (come chiamate di rete, lettura/scrittura su file o accesso a un database) senza bloccare l'esecuzione del resto del programma.

Quando una funzione asincrona viene chiamata, il programma non si ferma in attesa che l'operazione venga completata.

Invece, continua a eseguire altre operazioni e "torna" ai risultati della funzione asincrona quando questi sono disponibili.

Perché usare l’asincronismo in Flutter?

  1. Evitare il blocco dell’interfaccia utente (UI): In Flutter, operazioni lente potrebbero bloccare la UI, causando un’esperienza utente negativa. L’asincronismo risolve questo problema.
  1. Gestione di operazioni lente: Come richieste HTTP, query su database o caricamento di file.
  1. Efficienza: Permette al programma di sfruttare al meglio il tempo di esecuzione, gestendo più operazioni contemporaneamente.

Concetti chiave: Future e Stream

  • Future: Rappresenta un valore o un errore che sarà disponibile in futuro. È ideale per operazioni che producono un risultato singolo.
  • Stream: Rappresenta una sequenza di eventi o valori che vengono prodotti nel tempo, come dati ricevuti da una connessione o input dell'utente.

Come Funzionano async e await in Dart

La parola chiave async definisce una funzione asincrona, mentre await sospende temporaneamente l’esecuzione fino a quando un Future non restituisce un valore.

Sintassi di Base

Future<void> esempioAsync() async {
 print("Inizio");
 await Future.delayed(Duration(seconds: 2));
 print("Fine");
}

Spiegazione:

  1. async definisce la funzione come asincrona.
  1. await aspetta che il Future.delayed venga completato.
  1. La funzione continua l’esecuzione senza bloccare il programma.

Esempi Pratici

Esempio 1: Chiamata a un’API

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<void> fetchData() async {
 final response = await http.get(Uri.parse("https://jsonplaceholder.typicode.com/posts/1"));
 
 if (response.statusCode == 200) {
   print(jsonDecode(response.body));
 } else {
   print("Errore nella richiesta: ${response.statusCode}");
 }
}


Esempio 2: Lettura da un File

import 'dart:io';

Future<void> readFile() async {
 final file = File('file.txt');
 String content = await file.readAsString();
 print(content);
}

Esempio 3: Uso di uno Stream

Stream<int> numeroStream() async* {
 for (int i = 0; i < 5; i++) {
   await Future.delayed(Duration(seconds: 1));
   yield i;
 }

}

void main() async {
 await for (var numero in numeroStream()) {
   print("Numero ricevuto: $numero");
 }
}

La parola chiave async definisce una funzione asincrona, mentre await sospende temporaneamente l’esecuzione fino a quando un Future non restituisce un valore.

Esercizi

  1. Stampa di numeri con ritardo: Scrivi una funzione asincrona che stampa i numeri da 1 a 10 con un ritardo di 1 secondo tra ogni numero.
  1. Simulazione di un caricamento: Scrivi una funzione che simula un’operazione di caricamento (es. download di un file) con un ritardo di 3 secondi e stampa un messaggio al completamento.
  1. Uso di un Future per calcolare: Crea una funzione che esegue un’operazione matematica (es. somma di due numeri) e restituisce il risultato dopo 2 secondi.
  1. Streaming di messaggi: Implementa uno Stream che invia 5 messaggi con un ritardo di 1 secondo tra ciascuno.

Vantaggi dell’Asincronismo in Flutter

  1. UI Reattiva: Le operazioni asincrone garantiscono che l’interfaccia rimanga fluida anche durante l’esecuzione di processi intensivi.
  1. Miglior Esperienza Utente: Consente di implementare animazioni e indicatori di caricamento senza interruzioni.
  1. Scalabilità: L’asincronismo permette di gestire applicazioni complesse con operazioni simultanee.

Conclusioni

Comprendere le funzioni asincrone è essenziale per sfruttare al meglio le potenzialità di Dart e Flutter.

Grazie a Future, Stream e alle parole chiave async e await, è possibile gestire operazioni complesse in modo efficiente, garantendo applicazioni performanti e un’esperienza utente ottimale.

Se sei agli inizi, prova gli esercizi proposti e continua a esplorare le possibilità offerte da Dart e Flutter.

Con pratica e dedizione, diventerai un esperto nello sviluppo asincrono!

Questo articolo ti ha aiutato a comprendere le basi delle funzioni asincrone in Dart?

Hai domande o dubbi?  Contattami se vuoi saperne di più!

Contattami

Hai domande sulla progettazione web
o sui servizi offerti?
Sarà un piacere assisterti.