En aquest tema, aprendrem com obtenir dades d'Internet utilitzant Flutter. Això és essencial per a moltes aplicacions modernes que necessiten interactuar amb serveis web per obtenir informació en temps real.
Objectius
- Comprendre com fer sol·licituds HTTP en Flutter.
- Aprendre a utilitzar el paquet
http. - Gestionar les respostes de les sol·licituds HTTP.
- Mostrar les dades obtingudes en la interfície d'usuari.
Requisits Previs
- Coneixements bàsics de Flutter i Dart.
- Familiaritat amb els widgets bàsics de Flutter.
Contingut
- Instal·lació del Paquet
http
httpPer fer sol·licituds HTTP en Flutter, utilitzarem el paquet http. Primer, hem d'afegir aquest paquet al nostre projecte.
- Obre el fitxer
pubspec.yaml. - Afegeix la dependència
httpa la secciódependencies:
- Executa
flutter pub getper instal·lar el paquet.
- Fer una Sol·licitud HTTP GET
Ara que tenim el paquet http instal·lat, podem fer una sol·licitud HTTP GET per obtenir dades d'Internet.
Exemple de Codi
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Obtenir Dades d\'Internet'),
),
body: DataFromInternet(),
),
);
}
}
class DataFromInternet extends StatefulWidget {
@override
_DataFromInternetState createState() => _DataFromInternetState();
}
class _DataFromInternetState extends State<DataFromInternet> {
String data = "Esperant dades...";
@override
void initState() {
super.initState();
fetchData();
}
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body)['title'];
});
} else {
setState(() {
data = 'Error en obtenir dades';
});
}
}
@override
Widget build(BuildContext context) {
return Center(
child: Text(data),
);
}
}Explicació del Codi
- Importacions: Importem els paquets necessaris (
httpidart:convert). - MyApp: Definim l'aplicació principal amb un
Scaffoldque conté unAppBari el widgetDataFromInternet. - DataFromInternet: Aquest és un
StatefulWidgetque farà la sol·licitud HTTP. - fetchData: Aquesta funció fa una sol·licitud GET a l'URL
https://jsonplaceholder.typicode.com/posts/1. Si la sol·licitud és exitosa (codi de resposta 200), actualitzem l'estat amb el títol del post obtingut. Si no, mostrem un missatge d'error. - initState: Cridem
fetchDataquan el widget s'inicialitza. - build: Mostrem les dades obtingudes en un
Textwidget.
- Gestió d'Errors
És important gestionar els errors quan fem sol·licituds HTTP. En l'exemple anterior, ja hem afegit una gestió bàsica d'errors. Podem millorar-ho afegint més detalls sobre l'error.
Exemple de Codi Millorat
Future<void> fetchData() async {
try {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body)['title'];
});
} else {
setState(() {
data = 'Error en obtenir dades: ${response.statusCode}';
});
}
} catch (e) {
setState(() {
data = 'Error en obtenir dades: $e';
});
}
}
- Mostrar Dades Complexes
En lloc de mostrar només una cadena de text, podem mostrar dades més complexes, com una llista d'elements.
Exemple de Codi
class DataFromInternet extends StatefulWidget {
@override
_DataFromInternetState createState() => _DataFromInternetState();
}
class _DataFromInternetState extends State<DataFromInternet> {
List<dynamic> data = [];
@override
void initState() {
super.initState();
fetchData();
}
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body);
});
} else {
setState(() {
data = [];
});
}
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(data[index]['title']),
subtitle: Text(data[index]['body']),
);
},
);
}
}Explicació del Codi
- data: Ara és una llista dinàmica que conté els posts obtinguts.
- fetchData: Fem una sol·licitud GET a
https://jsonplaceholder.typicode.com/postsper obtenir una llista de posts. - ListView.builder: Utilitzem un
ListView.builderper mostrar la llista de posts. CadaListTilemostra el títol i el cos del post.
Exercicis Pràctics
- Exercici 1: Modifica l'exemple per obtenir dades d'una API diferent. Prova amb l'API de GitHub per obtenir informació sobre un repositori.
- Exercici 2: Afegeix un botó per refrescar les dades manualment.
- Exercici 3: Implementa una gestió d'errors més detallada que mostri un diàleg d'alerta en cas d'error.
Solucions
Exercici 1
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://api.github.com/repos/flutter/flutter'));
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body)['description'];
});
} else {
setState(() {
data = 'Error en obtenir dades';
});
}
}Exercici 2
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
onPressed: fetchData,
child: Text('Refrescar Dades'),
),
Expanded(
child: Center(
child: Text(data),
),
),
],
);
}Exercici 3
Future<void> fetchData() async {
try {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body)['title'];
});
} else {
showErrorDialog('Error en obtenir dades: ${response.statusCode}');
}
} catch (e) {
showErrorDialog('Error en obtenir dades: $e');
}
}
void showErrorDialog(String message) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Error'),
content: Text(message),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('OK'),
),
],
);
},
);
}Conclusió
En aquest tema, hem après com obtenir dades d'Internet utilitzant Flutter i el paquet http. Hem vist com fer sol·licituds GET, gestionar les respostes i mostrar les dades en la interfície d'usuari. També hem après a gestionar errors i a treballar amb dades més complexes. Aquests coneixements són fonamentals per desenvolupar aplicacions modernes que necessiten interactuar amb serveis web.
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ó
