Introducción
Las Preferencias Compartidas (Shared Preferences) son una forma sencilla y eficiente de almacenar datos clave-valor de manera persistente en una aplicación Flutter. Este método es ideal para guardar configuraciones de usuario, estados de la aplicación, y otros datos que necesiten ser persistentes entre sesiones de la aplicación.
Objetivos
- Entender qué son las Preferencias Compartidas.
- Aprender a configurar y utilizar el paquete
shared_preferences
. - Implementar ejemplos prácticos de almacenamiento y recuperación de datos.
- Realizar ejercicios para reforzar los conceptos aprendidos.
¿Qué son las Preferencias Compartidas?
Las Preferencias Compartidas permiten almacenar datos en un formato clave-valor en el almacenamiento local del dispositivo. Estos datos persisten incluso cuando la aplicación se cierra y se vuelve a abrir.
Ventajas
- Simplicidad: Fácil de usar y configurar.
- Persistencia: Los datos se mantienen entre sesiones de la aplicación.
- Rendimiento: Rápido acceso a datos pequeños.
Limitaciones
- Tamaño: No es adecuado para almacenar grandes cantidades de datos.
- Seguridad: No es seguro para almacenar información sensible.
Configuración del Paquete shared_preferences
Para utilizar las Preferencias Compartidas en Flutter, primero debemos agregar el paquete shared_preferences
a nuestro proyecto.
Paso 1: Agregar Dependencia
Abre el archivo pubspec.yaml
y agrega la dependencia:
Luego, ejecuta el comando flutter pub get
para instalar la dependencia.
Paso 2: Importar el Paquete
En el archivo Dart donde deseas utilizar las Preferencias Compartidas, importa el paquete:
Uso de Preferencias Compartidas
Guardar Datos
Para guardar datos en las Preferencias Compartidas, primero necesitamos obtener una instancia de SharedPreferences
y luego usar los métodos set
para almacenar los datos.
Future<void> saveData() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('username', 'JohnDoe'); await prefs.setInt('age', 30); await prefs.setBool('isLoggedIn', true); }
Recuperar Datos
Para recuperar datos, utilizamos los métodos get
correspondientes.
Future<void> loadData() async { final prefs = await SharedPreferences.getInstance(); String? username = prefs.getString('username'); int? age = prefs.getInt('age'); bool? isLoggedIn = prefs.getBool('isLoggedIn'); print('Username: $username'); print('Age: $age'); print('Is Logged In: $isLoggedIn'); }
Eliminar Datos
Para eliminar datos, utilizamos el método remove
.
Future<void> removeData() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('username'); }
Ejemplo Práctico
Vamos a crear una pequeña aplicación que permita al usuario guardar y recuperar su nombre.
Paso 1: Crear la Interfaz de Usuario
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: HomeScreen(), ); } } class HomeScreen extends StatefulWidget { @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { final TextEditingController _controller = TextEditingController(); String _savedName = ''; @override void initState() { super.initState(); _loadName(); } Future<void> _loadName() async { final prefs = await SharedPreferences.getInstance(); setState(() { _savedName = prefs.getString('name') ?? ''; }); } Future<void> _saveName() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('name', _controller.text); _loadName(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Shared Preferences Example'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( controller: _controller, decoration: InputDecoration(labelText: 'Enter your name'), ), SizedBox(height: 20), ElevatedButton( onPressed: _saveName, child: Text('Save Name'), ), SizedBox(height: 20), Text('Saved Name: $_savedName'), ], ), ), ); } }
Explicación del Código
- Importaciones y Configuración Inicial: Importamos los paquetes necesarios y configuramos la aplicación principal.
- Controlador de Texto: Utilizamos un
TextEditingController
para manejar la entrada del usuario. - Métodos de Carga y Guardado: Creamos métodos para cargar y guardar el nombre utilizando
SharedPreferences
. - Interfaz de Usuario: Creamos una interfaz simple con un
TextField
, unElevatedButton
y unText
para mostrar el nombre guardado.
Ejercicios Prácticos
Ejercicio 1: Guardar y Recuperar Edad
Modifica la aplicación anterior para permitir al usuario guardar y recuperar su edad.
Solución
- Agrega un nuevo
TextEditingController
para la edad. - Modifica los métodos
_saveName
y_loadName
para manejar la edad. - Actualiza la interfaz de usuario para incluir un campo de entrada para la edad y mostrar la edad guardada.
Ejercicio 2: Eliminar Datos
Agrega un botón que permita al usuario eliminar su nombre y edad guardados.
Solución
- Crea un nuevo método
_removeData
que utiliceprefs.remove
. - Agrega un
ElevatedButton
a la interfaz de usuario que llame a_removeData
.
Conclusión
En esta sección, hemos aprendido a utilizar las Preferencias Compartidas en Flutter para almacenar y recuperar datos de manera persistente. Hemos cubierto la configuración del paquete shared_preferences
, así como ejemplos prácticos de cómo guardar, recuperar y eliminar datos. Los ejercicios proporcionados te ayudarán a reforzar estos conceptos y a aplicarlos en tus propias aplicaciones.
En la siguiente sección, exploraremos el almacenamiento de archivos en Flutter, lo que nos permitirá manejar datos más complejos y voluminosos.
Curso de Desarrollo con Flutter
Módulo 1: Introducción a Flutter
- ¿Qué es Flutter?
- Configuración del Entorno de Desarrollo
- Entendiendo la Arquitectura de Flutter
- Creando Tu Primera App con Flutter
Módulo 2: Conceptos Básicos de Programación en Dart
- Introducción a Dart
- Variables y Tipos de Datos
- Sentencias de Control de Flujo
- Funciones y Métodos
- Programación Orientada a Objetos en Dart
Módulo 3: Widgets en Flutter
- Introducción a los Widgets
- Widgets Stateless vs Stateful
- Widgets Básicos
- Widgets de Diseño
- Widgets de Entrada y Formularios
Módulo 4: Gestión de Estado
Módulo 5: Navegación y Enrutamiento
- Introducción a la Navegación
- Navegación Básica
- Rutas Nombradas
- Pasando Datos Entre Pantallas
- Deep Linking
Módulo 6: Redes y APIs
- Obteniendo Datos de Internet
- Parseo de Datos JSON
- Manejo de Errores de Red
- Usando APIs REST
- Integración con GraphQL
Módulo 7: Persistencia y Almacenamiento
- Introducción a la Persistencia
- Preferencias Compartidas
- Almacenamiento de Archivos
- Base de Datos SQLite
- Usando Hive para Almacenamiento Local
Módulo 8: Conceptos Avanzados de Flutter
- Animaciones en Flutter
- Custom Paint y Canvas
- Canales de Plataforma
- Isolates y Concurrencia
- Optimización de Rendimiento
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias
- Pruebas de Widgets
- Pruebas de Integración
- Técnicas de Depuración
Módulo 10: Despliegue y Mantenimiento
- Preparación para el Lanzamiento
- Construcción para iOS
- Construcción para Android
- Integración Continua/Despliegue Continuo (CI/CD)
- Mantenimiento y Actualización de Tu App