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
http
Per 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
http
a la secciódependencies
:
- Executa
flutter pub get
per 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 (
http
idart:convert
). - MyApp: Definim l'aplicació principal amb un
Scaffold
que conté unAppBar
i el widgetDataFromInternet
. - DataFromInternet: Aquest és un
StatefulWidget
que 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
fetchData
quan el widget s'inicialitza. - build: Mostrem les dades obtingudes en un
Text
widget.
- 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/posts
per obtenir una llista de posts. - ListView.builder: Utilitzem un
ListView.builder
per mostrar la llista de posts. CadaListTile
mostra 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ó