Cómo Guardar Objetos en SharedPreferences en Flutter

- Andrés Cruz

In english

En el desarrollo de aplicaciones en Flutter, muchas veces es necesario almacenar valores de manera persistente en la aplicación; para esto, tenemos muchas formas, la más completa sería emplear una base de datos en SQLite, pero, en caso de que solamente queramos almacenar unos pocos datos, como el usuario y datos referentes como un carrito de compra, cursos comprados, etc, podemos optar por un enfoque más sencillo como lo es las preferencias de usuarios, que es un paquete disponibles para Android, iOS, Windows, MacOS y cualquier tecnología que quieras emplear.

En este artículo introduciremos este tema para almacenar datos de manera persistente mediante SharedPreferences en Flutter.

¿Qué son SharedPreferences?

SharedPreferences es un mecanismo de almacenamiento persistente que permite a las aplicaciones Flutter (tanto en Android como en iOS) guardar datos en forma de pares clave-valor; al ser persistentes, significa que no estan solamente en memoria, sino, esta en disco, almacenados en una memoria no volatil y pueden ser fácilmente consultados y escritos.

Los datos son almacenados en XML en todas las aplicaciones; son ideales para gestionar datos de usuario como el ID, email, si está autenticado y otros datos relacionados, su implementación y uso es muy sencillo.

 

API de SharedPreferences

Como indicamos antes, con los SharedPreferences podemos escribir y leer (además de leer), así que, tenemos métodos para tal fin:

  • getKeys(): Retorna todas las claves almacenadas.
  • get(String key): Retorna el valor asociado con la clave especificada.
  • getBool(String key): Retorna un valor booleano asociado con la clave.
  • getInt(String key): Retorna un valor entero asociado con la clave.
  • getDouble(String key): Retorna un valor decimal (double) asociado con la clave.
  • getString(String key): Retorna un valor de texto (string) asociado con la clave.
  • getStringList(String key): Retorna una lista de valores de texto asociada con la clave.

Todos los métodos son lo mismo, pero, dependiendo del tipo de dato que quieras almacenar, tenemos un método distinto, como números, string, entre otros; en cuando los métodos para escribir:

  • setBool(String key, bool value): Guarda un valor booleano asociado con la clave.
  • setInt(String key, int value): Guarda un valor entero asociado con la clave.
  • setDouble(String key, double value): Guarda un valor decimal asociado con la clave.
  • setString(String key, String value): Guarda un valor de texto asociado con la clave.
  • setStringList(String key, List<String> value): Guarda una lista de valores de texto asociada con la clave.

Eliminación:

  • remove(String key): Elimina el par clave-valor asociado con la clave especificada.

También, pasar un valor nulo en cualquiera de los setters equivale a llamar a remove(key).

Ejemplo Práctico

Supongamos que tenemos una clase Person. Veamos cómo guardar una instancia de esta clase en SharedPreferences:

import 'package:shared_preferences/shared_preferences.dart';
class Person {
 final String name;
 final int age;
 Person(this.name, this.age);
}
void savePersonToSharedPreferences(Person person) async {
 final prefs = await SharedPreferences.getInstance();
 prefs.setString('person_name', person.name);
 prefs.setInt('person_age', person.age);
}
Future<Person?> getPersonFromSharedPreferences() async {
 final prefs = await SharedPreferences.getInstance();
 final name = prefs.getString('person_name');
 final age = prefs.getInt('person_age');
 if (name != null && age != null) {
   return Person(name, age);
 }
 return null;
}

Instalamos el paquete mediante:

dependencies:
 ...
 shared_preferences: any

Ya el siguiente paso es realizar la implementación anterior, en el cual, podemos registrar y obtener datos de usuario; antes de usarlo en cualquier parte de la aplicación, debemos de crear la instancia:

final prefs = await SharedPreferences.getInstance();

Como todas operaciones, son asíncronas, lo cual es normal en este tipo de tecnologías en donde se obtienen datos del disco.

Ahora, con este objeto, podemos establecer datos con los métodos mencionados antes, por ejemplo, un string:

prefs.setString(key, value);

Si es un objeto, puedes almacenar los datos en formato JSON:

prefs.setString(key, json.encode(value));

Aquí tienes un ejemplo completo:

save(String key, value) async {
 final prefs = await SharedPreferences.getInstance();
 prefs.setString(key, json.encode(value));
}

Y finalmente permite leer el objeto u otro:

get(String key) async {
 final prefs = await SharedPreferences.getInstance();
 return json.decode(prefs.getString(key));
}
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.