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
BuildContextper 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
ProviderScopeper habilitar l'ús de Riverpod. - Provider: Definim un proveïdor que retorna una cadena de text.
- Consumer: Utilitzem
Consumerper 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
watchper obtenir el valor actual del comptador. - read: Utilitzem
readper 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
StateProviderper 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
ListViewque 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ó
