Flutter Shared Preferences in profondità

Che cos’è la shared_preferences dove, quando e quanto utilizzarla?

La shared_preference è un plugin che vi permette di salvare dei dati in memoria dedicata all’app, la cartella che li conterrà prende il nome in android con il nome del pacchetto della vostra app es com.nomeazienda.nomeapp. I dati che possiamo memorizzare all’interno di questa memoria con questo plugin sono dei seguenti tipi:

  • string

  • intero

  • bool

  • List

E’ da notare che questi parametri non sono persistenti, rimangono nell’area dedicata all’app e quindi vengono eliminate nel momento in cui l’app viene disinstallata oppure se vengono rimossi i dati della cache dell’app. Quindi in genere è doveroso memorizzare dati di preferenze non indispensabili in modo che non sia una tragedia se dovessero essere persi. Un esempio classico può essere come voglio il tema light o dark oppure l’ordine degli oggetti nel menu.

Come si usa?

Salvataggio:

import 'package:shared_preferences/shared_preferences.dart';
SharedPreferences _preferences = await SharedPreferences.getInstance();
_preferences.setString("theme", "dark");
_preferences.setInt("countaccess", 2);

Recupero:

import 'package:shared_preferences/shared_preferences.dart';
SharedPreferences _preferences = await SharedPreferences.getInstance();
_preferences.getString("theme");
_preferences.getInt("countaccess");

In un primo momento potremmo pensare che è una cosa che serve a poco in quanto in una stringa non possiamo memorizzare tante informazioni. In realtà, se ci pensiamo bene, in una stringa possiamo anche memorizzare molto ma davvero molto semplicemente utilizzando un json, di seguito esempio:

import 'package:shared_preferences/shared_preferences.dart';
SharedPreferences _preferences = await SharedPreferences.getInstance();
_preferences.setString("{"name":"Andrea","surname":"Luciano","age":31,"sex":"M","SurnameCouldBeName":true}");

In questo esempio ho messo come campo SurnameCouldBeName in quanto il mio cognome è anche un nome. Tutti quelli che non mi conoscono mi chiedono sempre “Luciano è il nome o il cognome?” E ogni volta vorrei fare qualcosa del genere:

Possiamo quindi creare una collezione di persone utilizzando, al posto della singola stringa, una lista di stringhe come segue:

import 'package:shared_preferences/shared_preferences.dart';
SharedPreferences _preferences = await SharedPreferences.getInstance();
List<String> users = new List<String>();
users.add("{"name":"Andrea","surname":"Luciano","age":31,"sex":"M","SurnameCouldBeName":true}");
users.add("{"name":"elisa","surname":"luciano","age":32,"sex":"F","SurnameCouldBeName":false}");
_preferences.setStringList("users", users);

Questo infine potrebbe essere mappato in un oggetto in modo da accedere ai dati più semplicemente ed infine mostrarli nell’interfaccia:

Class UserDto()
{
String name, surname, age, sex, SurnameCouldBeName;
UserDto.fromJson(Map<String, dynamic> json)
: name= json[name],
surname= json[surname],
age= json[age],
sex= json[sex],
SurnameCouldBeName = json[SurnameCouldBeName];
}
SharedPreferences _preferences = await SharedPreferences.getInstance();
List<UserDto> UserObj = new List<UserDto>; 
List<String> users = _preferences.getStringList("users");
for(String userjson in users)
{
Map userMap = jsonDecode(userjson);
UserDto  = new UserDto.fromJson(userMap);
print(UserDto.name);
UserObj.add(UserDto);
}

Pensate ai possibili vantaggi e alle possibili applicazioni. Può essere utilizzato per memorizzare dati restituiti da un API. Con questo approccio, l’applicazione è più efficiente e potrebbe funzionare anche offline senza quindi dover utilizzare sempre la rete dati per recuperare i dati dal server.

Last modified: 15 May 2020