Introducció
Les Preferències Compartides (Shared Preferences) són una manera senzilla i eficient d'emmagatzemar dades petites i primitives en forma de parells clau-valor. Aquest mètode és ideal per guardar configuracions de l'usuari, estats de l'aplicació o qualsevol altra informació que necessiti persistir entre sessions.
Conceptes Clau
- Clau-Valor: Les dades s'emmagatzemen com a parells clau-valor, on la clau és una cadena única que identifica el valor.
- Persistència: Les dades emmagatzemades en les Preferències Compartides persisteixen fins que esborrem explícitament.
- Tipus de Dades: Les Preferències Compartides suporten tipus de dades primitives com
int
,double
,bool
,String
iList<String>
.
Configuració
Per utilitzar les Preferències Compartides en Flutter, necessitem afegir el paquet shared_preferences
al nostre projecte.
Pas 1: Afegir la Dependència
Afegiu la següent línia al fitxer pubspec.yaml
del vostre projecte:
Pas 2: Instal·lar les Dependències
Executeu el següent comandament per instal·lar les dependències:
Ús de les Preferències Compartides
Importar el Paquet
Primer, hem d'importar el paquet shared_preferences
al nostre fitxer Dart:
Guardar Dades
Per guardar dades, utilitzem el mètode set
corresponent al tipus de dada que volem emmagatzemar. Aquí teniu un exemple de com guardar una cadena:
Future<void> saveData() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('username', 'flutter_user'); }
Llegir Dades
Per llegir dades, utilitzem el mètode get
corresponent al tipus de dada que volem recuperar. Aquí teniu un exemple de com llegir una cadena:
Future<void> readData() async { final prefs = await SharedPreferences.getInstance(); final username = prefs.getString('username') ?? 'default_user'; print('Username: $username'); }
Esborrar Dades
Per esborrar dades, utilitzem el mètode remove
amb la clau corresponent:
Future<void> removeData() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('username'); }
Exemple Complet
A continuació, es mostra un exemple complet que inclou guardar, llegir i esborrar dades utilitzant Preferències Compartides:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: SharedPreferencesDemo(), ); } } class SharedPreferencesDemo extends StatefulWidget { @override _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState(); } class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> { String _username = 'default_user'; @override void initState() { super.initState(); _loadUsername(); } Future<void> _loadUsername() async { final prefs = await SharedPreferences.getInstance(); setState(() { _username = prefs.getString('username') ?? 'default_user'; }); } Future<void> _saveUsername(String username) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('username', username); _loadUsername(); } Future<void> _removeUsername() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('username'); _loadUsername(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Shared Preferences Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Username: $_username'), SizedBox(height: 20), ElevatedButton( onPressed: () => _saveUsername('flutter_user'), child: Text('Save Username'), ), ElevatedButton( onPressed: _removeUsername, child: Text('Remove Username'), ), ], ), ), ); } }
Exercicis Pràctics
Exercici 1: Guardar i Llegir un Enter
- Modifiqueu l'exemple anterior per guardar i llegir un enter (per exemple, l'edat de l'usuari).
- Afegiu un camp de text per permetre a l'usuari introduir la seva edat.
- Mostreu l'edat guardada a la pantalla.
Solució
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: SharedPreferencesDemo(), ); } } class SharedPreferencesDemo extends StatefulWidget { @override _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState(); } class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> { int _age = 0; final TextEditingController _ageController = TextEditingController(); @override void initState() { super.initState(); _loadAge(); } Future<void> _loadAge() async { final prefs = await SharedPreferences.getInstance(); setState(() { _age = prefs.getInt('age') ?? 0; }); } Future<void> _saveAge(int age) async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt('age', age); _loadAge(); } Future<void> _removeAge() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('age'); _loadAge(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Shared Preferences Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Age: $_age'), SizedBox(height: 20), TextField( controller: _ageController, keyboardType: TextInputType.number, decoration: InputDecoration(labelText: 'Enter your age'), ), ElevatedButton( onPressed: () { final age = int.tryParse(_ageController.text); if (age != null) { _saveAge(age); } }, child: Text('Save Age'), ), ElevatedButton( onPressed: _removeAge, child: Text('Remove Age'), ), ], ), ), ); } }
Conclusió
Les Preferències Compartides són una eina poderosa per emmagatzemar dades petites i primitives de manera persistent en les aplicacions Flutter. Amb aquest mòdul, heu après a configurar, guardar, llegir i esborrar dades utilitzant Preferències Compartides. Aquests conceptes són fonamentals per gestionar configuracions i estats de l'usuari de manera eficient.
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ó