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
TextEditingControllerpara 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, unElevatedButtony unTextpara 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
TextEditingControllerpara la edad. - Modifica los métodos
_saveNamey_loadNamepara 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
_removeDataque utiliceprefs.remove. - Agrega un
ElevatedButtona 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
