Flutter - Usando SharedPreferences


Hoje veremos o que é e como usar o recurso SharedPreferences do Flutter.

O que é o Flutter ?

O Flutter é um SDK de aplicativo móvel do Google que ajuda a criar aplicativos móveis modernos para iOS e Android usando uma única (quase) base de código.

Se você não conhece o Flutter veja o meu artigo :  Flutter - Primeiros contatos e impressões

O que é SharedPreferences ?

O recurso SharedPreferences é usado para armazenar dados no formato chave-valor no Android e iOS.

No Flutter SharedPreferences utiliza o NSUserDefaults no iOS e o SharedPreferences no Android, fornecendo um armazenamento persistente para dados simples.

Porque e como usar ?

O recurso SharedPreferences é usado para armazenar pequenas quantidades de dados como dados primitivos: int, double, bool, string e stringList.

Esses dados geralmente estão associados ao aplicativo; portanto, quando o usuário desinstalar o aplicativo, os dados também serão excluídos.

Assim ao invés um banco de dados para armazenar pequenas quantidades de informação como nome de usuário, variáveis int, double, bool e string, podemos usar de as SharedPreferences.

Como usar ?

Para poder usar esse recurso temos que usar o plugin shared_preferences referenciando-o no arquivo pubspec.yaml na seção dependencies.

...
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^0.4.3
...

A seguir quando for utilizar o recurso sem seu código basta adicionar o seguinte import:


  import 'package:shared_preferences/shared_preferences.dart';

Salvando e Lendo dados usando SharedPreferences

A primeira coisa a fazer para poder ler e escrever usando o recurso e obter uma instância do SharedPreferences:


 SharedPreferences prefs = await SharedPreferences.getInstance();

Agora que temos a instância prefs criada podemos usá-la para ler e salvar dados nos diversos formatos:

int

// salvar
prefs.setInt('idade', 42);
// ler
final idade = prefs.getInt('idade') ?? 0;

double

// salvar
prefs.setDouble('valor', 1.99);
// ler
final valor = prefs.getDouble('valor') ?? 0.0;

bool

// salvar
prefs.setBool('ativo', true);
// ler
final ativo = prefs.getBool('ativo') ?? false;

string

// salvar
prefs.setString('nome', 'Macoratti');
// ler
final nome = prefs.getString('nome') ?? '';

stringList

// salvar
prefs.setStringList('cursos', ['Fisica','Quimica','Ingles']);
// ler
final cursos = prefs.getStringList('curso') ?? [];

Nota: Para ler os dados estamos usando o operador ?? que vai obter o valor se não for null, e , se for null obtém o valor definido.

Exemplo prático :  Salvando e lendo o contador

Para ver um exemplo prático bem simples vamos criar um novo projeto no Flutter e mostrar como podemos salvar e ler os dados de um contador que é incrementado ao se clicar em um botão usando o código gerado para a aplicação padrão do Flutter e fazer alguns ajustes para usar o SharedPreferences.

Após criar o projeto vamos incluir a referência ao plugin  no arquivo pubspec.yaml :

A seguir no arquivo main.dart na pasta lib vamos incluir o código destacado em azul:

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(
      title: 'Usando SharedPreferences',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'SharedPreferences'),
    );
  }
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  void _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    _counter = (prefs.getInt('counter') ?? 0) + 1;
    await prefs.setInt('counter', _counter);
    setState(() {
      _counter++;
    });
  }
 @override
  void initState() {
    _leContador();
    super.initState();
  }
  _leContador() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter =  (prefs.getInt('counter') ?? 0);
    });    
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Você clicou no botão :',
            ),
             Text(
              '$_counter vezes' ,
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Incrementar',
        child: Icon(Icons.add),
      ), 
    );
  }
}

No método _incrementCounter() incluimos o código que cria uma instância de SharedPreferences , lê os valores armazenados previamente em SharedPreferences e incrementa o valor e a seguir salva o contador:

 void _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    _counter = (prefs.getInt('counter') ?? 0) + 1;
    await prefs.setInt('counter', _counter);
    setState(() {
      _counter++;
    });
  }

Para poder ler o valor armazenado na inicialização definimos o método initState() chamando o método _leContador():

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

O método _leContador cria uma instância de SharedPreferences() e lê o valor armazenado em counter exibindo na interface:

 _leContador() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter =  (prefs.getInt('counter') ?? 0);
    });    
  }

Assim, inicialmente o valor será zero mas depois poderemos parar nossa aplicação e ler o último valor armazenado do contador (counter) em SharedPreferences:

Abaixo temos o projeto em execução :

Pegue o código dos arquivos dart usados no projeto aqui:  main_sharedpreferences.dart

Referências:


José Carlos Macoratti