En aquest tema, aprendrem com gestionar errors de xarxa en aplicacions Flutter. La gestió adequada dels errors és crucial per proporcionar una experiència d'usuari fluida i professional. Veurem com detectar i manejar diferents tipus d'errors que poden ocórrer durant les sol·licituds de xarxa.
Conceptes Clau
-
Tipus d'Errors de Xarxa:
- Errors de Connexió
- Errors de Temps d'Espera (Timeout)
- Errors de Resposta (4xx, 5xx)
- Errors de Deserialització
-
Gestió d'Errors amb
try-catch:- Ús de blocs
try-catchper capturar excepcions. - Diferents tipus d'excepcions que poden ser capturades.
- Ús de blocs
-
Ús de la Llibreria
http:- Com fer sol·licituds HTTP amb la llibreria
http. - Com gestionar errors específics de la llibreria
http.
- Com fer sol·licituds HTTP amb la llibreria
-
Retroalimentació a l'Usuari:
- Mostrar missatges d'error a l'usuari.
- Estratègies per a la recuperació d'errors.
Exemples Pràctics
Exemple 1: Captura d'Errors de Connexió
import 'package:http/http.dart' as http;
Future<void> fetchData() async {
final url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
// Processar la resposta
print('Dades rebudes: ${response.body}');
} else {
// Gestionar errors de resposta
print('Error de resposta: ${response.statusCode}');
}
} on http.ClientException catch (e) {
// Gestionar errors de connexió
print('Error de connexió: $e');
} catch (e) {
// Gestionar altres tipus d'errors
print('Error inesperat: $e');
}
}Exemple 2: Gestió de Temps d'Espera
import 'package:http/http.dart' as http;
Future<void> fetchDataWithTimeout() async {
final url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url)).timeout(Duration(seconds: 5));
if (response.statusCode == 200) {
// Processar la resposta
print('Dades rebudes: ${response.body}');
} else {
// Gestionar errors de resposta
print('Error de resposta: ${response.statusCode}');
}
} on http.ClientException catch (e) {
// Gestionar errors de connexió
print('Error de connexió: $e');
} on TimeoutException catch (e) {
// Gestionar errors de temps d'espera
print('Error de temps d\'espera: $e');
} catch (e) {
// Gestionar altres tipus d'errors
print('Error inesperat: $e');
}
}Exemple 3: Mostrar Missatges d'Error a l'Usuari
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Gestió d\'Errors de Xarxa')),
body: Center(
child: ElevatedButton(
onPressed: () => fetchData(context),
child: Text('Obtenir Dades'),
),
),
),
);
}
Future<void> fetchData(BuildContext context) async {
final url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
// Processar la resposta
print('Dades rebudes: ${response.body}');
} else {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error de resposta: ${response.statusCode}');
}
} on http.ClientException catch (e) {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error de connexió: $e');
} catch (e) {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error inesperat: $e');
}
}
void _showErrorDialog(BuildContext context, String message) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Error'),
content: Text(message),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('D\'acord'),
),
],
);
},
);
}
}
void main() => runApp(MyApp());Exercicis Pràctics
Exercici 1: Captura d'Errors de Xarxa
Descripció: Escriu una funció que faci una sol·licitud HTTP a una URL i gestioni els errors de connexió, temps d'espera i resposta. Mostra un missatge d'error adequat per a cada tipus d'error.
Solució:
import 'package:http/http.dart' as http;
import 'dart:async';
Future<void> fetchData() async {
final url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url)).timeout(Duration(seconds: 5));
if (response.statusCode == 200) {
// Processar la resposta
print('Dades rebudes: ${response.body}');
} else {
// Gestionar errors de resposta
print('Error de resposta: ${response.statusCode}');
}
} on http.ClientException catch (e) {
// Gestionar errors de connexió
print('Error de connexió: $e');
} on TimeoutException catch (e) {
// Gestionar errors de temps d'espera
print('Error de temps d\'espera: $e');
} catch (e) {
// Gestionar altres tipus d'errors
print('Error inesperat: $e');
}
}Exercici 2: Mostrar Missatges d'Error a l'Usuari
Descripció: Modifica l'exemple anterior per mostrar missatges d'error a l'usuari mitjançant un AlertDialog.
Solució:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Gestió d\'Errors de Xarxa')),
body: Center(
child: ElevatedButton(
onPressed: () => fetchData(context),
child: Text('Obtenir Dades'),
),
),
),
);
}
Future<void> fetchData(BuildContext context) async {
final url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url)).timeout(Duration(seconds: 5));
if (response.statusCode == 200) {
// Processar la resposta
print('Dades rebudes: ${response.body}');
} else {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error de resposta: ${response.statusCode}');
}
} on http.ClientException catch (e) {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error de connexió: $e');
} on TimeoutException catch (e) {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error de temps d\'espera: $e');
} catch (e) {
// Mostrar missatge d'error a l'usuari
_showErrorDialog(context, 'Error inesperat: $e');
}
}
void _showErrorDialog(BuildContext context, String message) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Error'),
content: Text(message),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('D\'acord'),
),
],
);
},
);
}
}
void main() => runApp(MyApp());Conclusió
La gestió d'errors de xarxa és una part essencial del desenvolupament d'aplicacions Flutter. Hem après a capturar i gestionar diferents tipus d'errors de xarxa, així com a proporcionar retroalimentació adequada a l'usuari. Amb aquests coneixements, estàs preparat per manejar errors de xarxa de manera efectiva en les teves aplicacions Flutter.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació
