En aquest tema, aprendrem com integrar GraphQL en una aplicació Flutter. GraphQL és un llenguatge de consulta per a APIs que permet als clients sol·licitar exactament les dades que necessiten, i res més. Això pot millorar l'eficiència de les aplicacions mòbils, ja que redueix la quantitat de dades transferides i processades.
Objectius
- Comprendre què és GraphQL i com funciona.
- Configurar una API GraphQL en una aplicació Flutter.
- Realitzar consultes i mutacions amb GraphQL.
- Gestionar errors i respostes de l'API.
Què és GraphQL?
GraphQL és un llenguatge de consulta per a APIs i un entorn d'execució per a les teves consultes, amb les dades existents. Proporciona una descripció completa i comprensible de les dades de la teva API, permetent als clients sol·licitar exactament el que necessiten i res més.
Avantatges de GraphQL
- Sol·licituds eficients: Només es recuperen les dades necessàries.
- Tipat fort: Les consultes es validen contra un esquema.
- Flexibilitat: Els clients poden definir l'estructura de la resposta.
Configuració de l'Entorn
Instal·lació de les Dependències
Per començar, necessitem afegir les dependències necessàries al nostre projecte Flutter. Utilitzarem el paquet graphql_flutter
per facilitar la integració.
Afegiu les següents línies al fitxer pubspec.yaml
:
Després, executeu flutter pub get
per instal·lar les dependències.
Configuració del Client GraphQL
Primer, configurem el client GraphQL. Crearem un fitxer graphql_config.dart
per gestionar la configuració del client.
import 'package:graphql_flutter/graphql_flutter.dart'; class GraphQLConfig { static HttpLink httpLink = HttpLink( 'https://api.example.com/graphql', // URL de la teva API GraphQL ); static ValueNotifier<GraphQLClient> client = ValueNotifier( GraphQLClient( link: httpLink, cache: GraphQLCache(store: InMemoryStore()), ), ); static GraphQLClient getClient() { return GraphQLClient( link: httpLink, cache: GraphQLCache(store: InMemoryStore()), ); } }
Realitzar Consultes
Exemple de Consulta
Crearem una consulta per obtenir una llista d'usuaris. Primer, definim la consulta en una variable.
Executar la Consulta
Utilitzarem el widget Query
proporcionat per graphql_flutter
per executar la consulta i mostrar els resultats.
import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'graphql_config.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GraphQLProvider( client: GraphQLConfig.client, child: MaterialApp( home: UserListScreen(), ), ); } } class UserListScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('User List'), ), body: Query( options: QueryOptions( document: gql(readUsers), ), builder: (QueryResult result, { VoidCallback? refetch, FetchMore? fetchMore }) { if (result.hasException) { return Text(result.exception.toString()); } if (result.isLoading) { return Center(child: CircularProgressIndicator()); } List users = result.data!['users']; return ListView.builder( itemCount: users.length, itemBuilder: (context, index) { final user = users[index]; return ListTile( title: Text(user['name']), subtitle: Text(user['email']), ); }, ); }, ), ); } }
Realitzar Mutacions
Exemple de Mutació
Crearem una mutació per afegir un nou usuari. Primer, definim la mutació en una variable.
const String addUser = """ mutation AddUser(\$name: String!, \$email: String!) { addUser(name: \$name, email: \$email) { id name email } } """;
Executar la Mutació
Utilitzarem el widget Mutation
proporcionat per graphql_flutter
per executar la mutació.
class AddUserScreen extends StatelessWidget { final TextEditingController nameController = TextEditingController(); final TextEditingController emailController = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Add User'), ), body: Mutation( options: MutationOptions( document: gql(addUser), ), builder: (RunMutation runMutation, QueryResult? result) { return Column( children: [ TextField( controller: nameController, decoration: InputDecoration(labelText: 'Name'), ), TextField( controller: emailController, decoration: InputDecoration(labelText: 'Email'), ), ElevatedButton( onPressed: () { runMutation({ 'name': nameController.text, 'email': emailController.text, }); }, child: Text('Add User'), ), if (result != null) ...[ if (result.hasException) Text(result.exception.toString()), if (result.isLoading) CircularProgressIndicator(), if (result.data != null) Text('User added successfully!'), ], ], ); }, ), ); } }
Gestió d'Errors
És important gestionar els errors que poden sorgir durant les consultes i mutacions. graphql_flutter
proporciona informació detallada sobre els errors a través de l'objecte QueryResult
.
Exemple de Gestió d'Errors
Exercicis Pràctics
- Consulta Avançada: Crea una consulta que obtingui una llista de productes amb els seus preus i descripcions.
- Mutació Avançada: Crea una mutació que actualitzi la informació d'un usuari existent.
- Gestió d'Errors: Implementa una gestió d'errors més robusta que mostri missatges d'error personalitzats segons el tipus d'error.
Resum
En aquest tema, hem après com integrar GraphQL en una aplicació Flutter. Hem configurat el client GraphQL, realitzat consultes i mutacions, i gestionat errors. GraphQL proporciona una manera eficient i flexible de treballar amb APIs, permetent-nos sol·licitar exactament les dades que necessitem.
Amb aquests coneixements, estàs preparat per començar a utilitzar GraphQL en les teves aplicacions Flutter i aprofitar els seus avantatges per millorar l'eficiència i la flexibilitat de les teves solucions.
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ó