Introducció a Riverpod
Riverpod és un paquet de gestió d'estat per a Flutter que ofereix una manera més segura i flexible de gestionar l'estat en comparació amb altres solucions com Provider
. Riverpod es basa en els mateixos principis que Provider
, però amb algunes millores clau que el fan més robust i fàcil d'utilitzar.
Característiques Clau de Riverpod
- Seguretat en temps de compilació: Riverpod detecta errors en temps de compilació, evitant molts problemes comuns que es poden trobar en temps d'execució.
- Sense context: No cal passar el
BuildContext
per accedir als proveïdors, el que simplifica molt el codi. - Modularitat: Permet una millor organització del codi, ja que els proveïdors es poden definir fora dels widgets.
- Testabilitat: Facilita la creació de proves unitàries gràcies a la seva arquitectura.
Instal·lació de Riverpod
Per començar a utilitzar Riverpod, primer cal afegir el paquet al fitxer pubspec.yaml
del teu projecte:
Després, executa flutter pub get
per instal·lar el paquet.
Creació d'un Proveïdor amb Riverpod
Exemple Bàsic
A continuació, es mostra un exemple bàsic de com crear i utilitzar un proveïdor amb Riverpod.
- Definició del Proveïdor:
import 'package:flutter_riverpod/flutter_riverpod.dart'; // Definim un proveïdor de tipus String final helloWorldProvider = Provider((ref) => 'Hello, World!');
- Ús del Proveïdor en un Widget:
import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; void main() { runApp(ProviderScope(child: MyApp())); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Riverpod Example')), body: Center( child: Consumer( builder: (context, watch, child) { final message = watch(helloWorldProvider); return Text(message); }, ), ), ), ); } }
Explicació del Codi
- ProviderScope: És necessari embolcallar l'aplicació amb
ProviderScope
per habilitar l'ús de Riverpod. - Provider: Definim un proveïdor que retorna una cadena de text.
- Consumer: Utilitzem
Consumer
per accedir al proveïdor dins del widget i mostrar el valor retornat.
Proveïdors d'Estat
Riverpod també permet crear proveïdors que gestionen l'estat mutable. A continuació es mostra un exemple d'un proveïdor d'estat:
Exemple amb StateProvider
- Definició del StateProvider:
- Ús del StateProvider en un Widget:
class CounterApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Counter App')), body: Center( child: Consumer( builder: (context, watch, child) { final counter = watch(counterProvider).state; return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Counter: $counter'), ElevatedButton( onPressed: () { context.read(counterProvider).state++; }, child: Text('Increment'), ), ], ); }, ), ), ), ); } }
Explicació del Codi
- StateProvider: Definim un proveïdor d'estat que inicialitza el comptador a 0.
- watch: Utilitzem
watch
per obtenir el valor actual del comptador. - read: Utilitzem
read
per modificar l'estat del comptador.
Exercici Pràctic
Objectiu
Crear una aplicació Flutter que utilitzi Riverpod per gestionar l'estat d'una llista de tasques.
Requisits
- Definir un
StateProvider
per gestionar una llista de tasques. - Crear un formulari per afegir noves tasques a la llista.
- Mostrar la llista de tasques en un
ListView
.
Solució
- Definició del StateProvider:
- Creació del Formulari i Llista de Tasques:
class TaskApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Task App')), body: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: TaskForm(), ), Expanded( child: TaskList(), ), ], ), ), ); } } class TaskForm extends StatefulWidget { @override _TaskFormState createState() => _TaskFormState(); } class _TaskFormState extends State<TaskForm> { final _controller = TextEditingController(); @override Widget build(BuildContext context) { return Row( children: [ Expanded( child: TextField( controller: _controller, decoration: InputDecoration(labelText: 'New Task'), ), ), ElevatedButton( onPressed: () { final task = _controller.text; if (task.isNotEmpty) { context.read(tasksProvider).state = [ ...context.read(tasksProvider).state, task ]; _controller.clear(); } }, child: Text('Add'), ), ], ); } } class TaskList extends ConsumerWidget { @override Widget build(BuildContext context, ScopedReader watch) { final tasks = watch(tasksProvider).state; return ListView.builder( itemCount: tasks.length, itemBuilder: (context, index) { return ListTile( title: Text(tasks[index]), ); }, ); } }
Explicació del Codi
- TaskForm: Un formulari senzill per afegir noves tasques a la llista.
- TaskList: Un
ListView
que mostra les tasques actuals.
Conclusió
Riverpod és una eina poderosa per a la gestió d'estat en aplicacions Flutter. Ofereix una manera més segura i flexible de gestionar l'estat, amb una millor modularitat i testabilitat. Amb els exemples i exercicis proporcionats, hauríeu de tenir una bona comprensió de com utilitzar Riverpod en els vostres projectes 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ó