Aplicacions amb Flutter, Dart i Flame

Tutorial Flutter Flame Projectes   Recursos CITCEA
Exemples Dart Dades pràctiques     Inici

Guardar dades de forma permanent

Cada cop que obrim l'aplicació, les variables tornen a agafar els seus valors per defecte. Sovint, però, ens interessa guardar algunes dades (noms d'usuari, configuracions, etc.) en forma permanent; de manera que els valors a l'iniciar l'aplicació siguin els que l'usuari ha configurat en alguna utilització anterior.

La biblioteca SharedPreferences ens permet guardar dades de diversos tipus en forma permanent a la memòria del dispositiu i tornar-les a carregar quan ens convingui. Per fer servir aquesta biblioteca, cal anar al fitxer pubspec.yaml per dir-li que la volem fer servir. Ho hem de posar a dependencies, indicant quina és la versió que volem. És recomanable indicar la darrera versió; que podem veure a la pàgina corresponent. Quan vam escriure aquest text era la 2.5.3.

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.5.3

Un cop afegit, cal picar al botó per baixar el paquet (baixar). En el programa, cal importar el paquet shared_preferences.dart.

import 'package:shared_preferences/shared_preferences.dart';

Pot succeir que la nostra versió de NDK per a Android no sigui l'adequada, en aquest cas és probable que ens doni un error; si és així, ens indicarà quina és la versió de NDK que cal tenir. Caldrà modificar el fitxer build.gradle.kts (que es troba a la carpeta app dins de la carpeta android), posant o editant la línia dins de l'element android:

android {
    ndkVersion = "27.0.12077973"

En el moment d'escriure això, es disposa de funcions per guardar dades de tipus booleà, enter, real, text i llista de text. Per guardar un valor cal proporcionar una clau (sempre de text) i un valor. Si la nostra aplicació té diversos paràmetres a guardar, no és massa raonable fer-ho de manera específica per a cada un; probablement és preferible crear una funció que ens permeti guardar un paràmetre de qualsevol tipus. Atès que cada tipus de paràmetre es guarda d'una forma diferent, aquesta funció mira quin és i actua en conseqüència.

  _guardaOpcions(String clau, dynamic valor) async{
    final opcions = await SharedPreferences.getInstance();
    if(valor is bool){
      await opcions.setBool(clau, valor);
    } else if (valor is int){
      await opcions.setInt(clau, valor);
    } else if (valor is double){
      await opcions.setDouble(clau, valor);
    } else if (valor is String){
      await opcions.setString(clau, valor);
    } else if (valor is List<String>){
      await opcions.setStringList(clau, valor);
    }
  }

Necessitem les claus de les opcions, com a mínim, al guardar i al recuperar. Una bona política és crear una classe on estiguin totes guardades. Així, es poden afegir, modificar i esborrar les claus en un únic lloc.

class ClausOpcions{
  static const grafic = "Grafic";
  static const usuari = "Usuari";
}

Per guardar les dades, només cal cridar a la funció; indicant la clau i el valor.

...
                child: Switch(
                  value: _grafic, 
                  onChanged:(value) {
                    setState(() =>  _grafic = value);
                    _guardaOpcions(ClausOpcions.grafic, _grafic);
                  },
                ),
...

Normalment llegim tots els paràmetres a l'inici i, per tant, té sentit crear una única funció que els llegeixi tots i els guardi a les corresponents variables; convé indicar un valor per defecte, per si encara no s'han guardat mai les dades o l'usuari ha esborrat les dades de l'aplicació:

  _agafaOpcions() async{
    final opcions = await SharedPreferences.getInstance();
    setState(() {
      _grafic = opcions.getBool(ClausOpcions.grafic) ?? false;
      _usuari = opcions.getString(ClausOpcions.usuari) ?? "Desconegut";
    });
  }

El més habitual és cridar aquesta funció durant les tasques d'inicialització de l'aplicació.

  @override
  void initState() {
    super.initState();
    _agafaOpcions();
  }

Podem trobar un exemple d'això en aquest apartat, que correspon a l'exemple de dades d'un full de càlcul.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.